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

Pin*_*_be 6 c++ size class 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;
}
Run Code Online (Sandbox Code Playgroud)

版画

20
24
8
4
Run Code Online (Sandbox Code Playgroud)

所以很容易看出一个uint64_t和两个uint32_t一样大,为什么类2有4个额外的字节,如果它们是相同的,除了替换两个uint32_t用于uint64_t.

lis*_*isu 6

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

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

#pragma pack(1)

class ... {

};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

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

  • 或者,他可以在类定义中更改变量的顺序. (2认同)
  • 此外,`#pragma pack`是特定于编译器的(即使它可能得到广泛支持) (2认同)