use*_*r50 8 c c++ structure padding
struct A
{
uint32_t var1;
uint32_t var2;
uint32_t var3;
uint32_t var4;
uint32_t var5;
};
Run Code Online (Sandbox Code Playgroud)
在上面的结构中,编译器不会填充并分配20个字节.
现在我们有另一个结构,它包含一个8字节变量而不是两个4字节.在这种情况下,编译器填充并为此结构分配24个字节.
struct B
{
uint32_t var1;
uint32_t var2;
uint32_t var3;
uint64_t var5;
};
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种行为?如果编译器将数据对齐到8字节边界,那么在第一个结构中应该有4个字节的填充,并且在这种情况下不应该填充第二个结构.如果编译器将数据对齐到4字节边界,那么为什么在第二个结构中有4个字节的填充?
编译器:GCC平台:64位linux,x86_64
对齐规则(在x86和x86_64上)通常是将变量对齐它的大小.
换句话说,32位变量在4个字节上对齐,8位字节上的64位变量等.
在第二种情况下,在两者之间添加4个字节的填充
uint32_t var3;
uint64_t var5;
Run Code Online (Sandbox Code Playgroud)
获得var5对8个字节对齐.
出于这个原因,最好从大到小订购数据成员(但由于数据局部性,可读性等原因,这并不是那么简单).