在 VC++ 上,为什么编译器只在使用非 char 数据类型时填充结构?
IE
struct TEST
{
char a[7];
};
struct TEST2
{
__int32 a;
char b[7];
};
sizeof(TEST); // Returns 7
sizeof(TEST2); // Returns 12
在 VC++ 上,为什么编译器只在使用非 char 数据类型时填充结构?
IE
struct TEST
{
char a[7];
};
struct TEST2
{
__int32 a;
char b[7];
};
sizeof(TEST); // Returns 7
sizeof(TEST2); // Returns 12
归根结底是sizeof(char) == 1
——总是。
数组必须是连续的,因此在 char 数组中(如果它足够大),您最终会得到每个可能对齐的元素。由于编译器/硬件必须使其工作,因此不需要插入填充来处理char
类似的事情struct
。
现在,这并不是说编译器不能插入填充。例如,即使使用 char 数组,它也可以通过这样做来提高性能。例如,根据您的struct
定义,编译器完全可以接受 7 个字符的数组再填充一个以使 struct 的大小为 8 - 2 的漂亮、简洁的幂。
在某些硬件上,您可能会看到这一点。碰巧的是,VC++ 支持的英特尔硬件并没有真正从这样的事情中受益,所以你不太可能在那里看到它。