在 VC++ 上,为什么编译器只在使用非字符数据类型时填充结构?
即
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 个字符的数组再填充一个,使结构的大小为 8 —— 一个漂亮、简洁的 2 的幂。
在某些硬件上,您可能会看到它。碰巧的是,VC++ 支持的 Intel 硬件并没有真正从类似的东西中受益,所以你不太可能在那里看到它。
关于C++ 编译器对齐 - 仅字符无填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043486/