我已经声明了一个联合将4100个字节分配给变量"sample_union",并将相同的联合声明作为分配4104个字节的结构的一部分.
union test_size_union {
struct {
uint8_t type;
union {
uint8_t count;
uint8_t list;
};
uint16_t rc;
uint16_t arr_value[2048];
};
uint64_t first_dword;
}__attribute__((packed)) sample_union ;
Run Code Online (Sandbox Code Playgroud)
将上述联合置于结构内部分配4104个字节.
struct test_size_struct {
union {
struct {
uint8_t type;
union {
uint8_t count;
uint8_t list;
};
uint16_t rc;
uint16_t arr_value[2048];
};
uint64_t first_dword;
};
}__attribute__((packed)) sample_struct;
Run Code Online (Sandbox Code Playgroud)
嗯,这不是项目要求,但我想知道为什么编译器对这两个声明的行为不同.
gcc版本:(GCC)4.9.2,x86_64
平台:Linux,x86_64
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