c++ - 为什么在一个类中使用 uint64_t 需要比 2 个 uint32_t 更多的内存?以及如何防止这种情况?

标签 c++ class size uint64

我做了下面的代码作为例子。

#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 会有 4 个额外字节,如果它们除了用两个 uint32_t 替换一个 uint64_t 之外是相同的。

最佳答案

正如所指出的,这是由于 padding .

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

#pragma pack(1)

class ... {

};
#pragma pack(pop)

它告诉您的编译器不是对齐到 8 个字节,而是对齐到一个字节。 pop 命令将其关闭(这非常重要,因为如果您在 header 中这样做并且有人包含您的 header ,则可能会出现非常奇怪的错误)

关于c++ - 为什么在一个类中使用 uint64_t 需要比 2 个 uint32_t 更多的内存?以及如何防止这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26381206/

相关文章:

c++ - 如何检测USRP USB类型?

java - 什么是名为 somethingEntity 的类?

c++ - 链表中的后增量运算符

c++ - 将值设置为 static const unsigned int

python - 使用 python ('NoneType' 对象进行网页抓取没有属性 'get_text' )

android - iOS 和 Android 应用程序的最大大小

iphone - iPhone 中的图像尺寸不正确

android - 更改实际 Spinner 按钮对象的字体大小

c++ - 访问 Multiset 元素 C++ 时出错

java - 如何使用定时器类