我以下面的代码为例。
#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个额外的字节。
如前所述,这是由于padding造成的。
为了防止这种情况,您可以使用
#pragma pack(1)
class ... {
};
#pragma pack(pop)
它告诉编译器不要对齐8个字节,而是对齐一个字节。pop命令将其关闭(这非常重要,因为如果在标头中执行此操作并且有人包含标头,则可能会发生非常奇怪的错误)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句