在类中使用uint64_t时为什么比2个uint32_t需要更多的内存?以及如何预防呢?

品纳

我以下面的代码为例。

#include <iostream>

struct class1
{

    uint8_t     a;
    uint8_t     b;
    uint16_t    c;
    uint32_t    d;
    uint32_t    e;

    uint32_t    f;
    uint32_t    g;
};

struct class2
{

    uint8_t     a;
    uint8_t     b;
    uint16_t    c;
    uint32_t    d;
    uint32_t    e;

    uint64_t    f;
};

int main(){
    std::cout << sizeof(class1) << std::endl;
    std::cout << sizeof(class2) << std::endl;
    std::cout << sizeof(uint64_t) << std::endl;
    std::cout << sizeof(uint32_t) << std::endl;
}

印刷

20
24
8
4

因此,很容易看到一个uint64_t与两个uint32_t一样大,如果类2除了用两个uint32_t替换一个uint64_t相同,为什么类2会有4个额外的字节。

su

如前所述,这是由于padding造成的

为了防止这种情况,您可以使用

#pragma pack(1)

class ... {

};
#pragma pack(pop)

它告诉编译器不要对齐8个字节,而是对齐一个字节。pop命令将其关闭(这非常重要,因为如果在标头中执行此操作并且有人包含标头,则可能会发生非常奇怪的错误)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Emulate uint32_t in Python?

来自分类Dev

在Python中模拟uint32_t?

来自分类Dev

uint32_t数组的NSLog内容

来自分类Dev

uint32_t vs uint_fast32_t vs uint_least32_t

来自分类Dev

指向存储在uint64_t中的内存位置的指针

来自分类Dev

动态整数大小:int64_t,int32_t,uint32_t等

来自分类Dev

在Objective C UIFontDescriptor.h常量中使用枚举,uint32_t和移位

来自分类Dev

使用uint64_t的分段错误(核心已转储)

来自分类Dev

何时使用size_t和uint32_t?

来自分类Dev

我可以在for块中使用uint64_t吗?

来自分类Dev

C-为什么使用uint64_t计数器时for循环会卡住,而while循环却不会?

来自分类Dev

将uint64_t截断为uint8_t [i]时应该使用位掩码吗?

来自分类Dev

将uint8_t数组强制转换为uint32_t会发生什么?

来自分类Dev

对uint64_t类型使用内置的溢出函数

来自分类Dev

使用std :: hash <uint64_t>作为自定义类

来自分类Dev

什么是(uint32_t *)?

来自分类Dev

使用uint64_t的不便

来自分类Dev

如何在C中复制一个指针数组?(uint32_t)

来自分类Dev

在32位应用程序中使用uint64_t

来自分类Dev

动态整数大小:int64_t,int32_t,uint32_t等

来自分类Dev

一个使用uint32_t代替unsigned int的实际示例

来自分类Dev

为什么需要运行postgresql nextval函数?以及如何预防呢?

来自分类Dev

错误:uint32_t的声明冲突

来自分类Dev

移位和屏蔽32位值时uint64_t的未定义高阶

来自分类Dev

为什么sscanf%lx在64位环境中对于任何第一个uint32_t都读取“ 0”?

来自分类Dev

为什么此uint32_t以这种方式在内存中排序?

来自分类Dev

使用uint32_t *更改uint8_t数组的值

来自分类Dev

将 2 个 uint16_t 合并成 1 个 uint32_t

来自分类Dev

将两个 uint32_t 转换为 uint64_t,然后根据位模式而不是值转换回双精度

Related 相关文章

  1. 1

    Emulate uint32_t in Python?

  2. 2

    在Python中模拟uint32_t?

  3. 3

    uint32_t数组的NSLog内容

  4. 4

    uint32_t vs uint_fast32_t vs uint_least32_t

  5. 5

    指向存储在uint64_t中的内存位置的指针

  6. 6

    动态整数大小:int64_t,int32_t,uint32_t等

  7. 7

    在Objective C UIFontDescriptor.h常量中使用枚举,uint32_t和移位

  8. 8

    使用uint64_t的分段错误(核心已转储)

  9. 9

    何时使用size_t和uint32_t?

  10. 10

    我可以在for块中使用uint64_t吗?

  11. 11

    C-为什么使用uint64_t计数器时for循环会卡住,而while循环却不会?

  12. 12

    将uint64_t截断为uint8_t [i]时应该使用位掩码吗?

  13. 13

    将uint8_t数组强制转换为uint32_t会发生什么?

  14. 14

    对uint64_t类型使用内置的溢出函数

  15. 15

    使用std :: hash <uint64_t>作为自定义类

  16. 16

    什么是(uint32_t *)?

  17. 17

    使用uint64_t的不便

  18. 18

    如何在C中复制一个指针数组?(uint32_t)

  19. 19

    在32位应用程序中使用uint64_t

  20. 20

    动态整数大小:int64_t,int32_t,uint32_t等

  21. 21

    一个使用uint32_t代替unsigned int的实际示例

  22. 22

    为什么需要运行postgresql nextval函数?以及如何预防呢?

  23. 23

    错误:uint32_t的声明冲突

  24. 24

    移位和屏蔽32位值时uint64_t的未定义高阶

  25. 25

    为什么sscanf%lx在64位环境中对于任何第一个uint32_t都读取“ 0”?

  26. 26

    为什么此uint32_t以这种方式在内存中排序?

  27. 27

    使用uint32_t *更改uint8_t数组的值

  28. 28

    将 2 个 uint16_t 合并成 1 个 uint32_t

  29. 29

    将两个 uint32_t 转换为 uint64_t,然后根据位模式而不是值转换回双精度

热门标签

归档