我做了下面的代码作为例子。
#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/