我正在看一个小程序 -
#include<iostream>
class A
{
bool a;
bool c;
};
int main()
{
std::cout << sizeof(A) << std::endl;
return 0;
}
这里,它将A类的大小显示为2个字节。但是,如果我将另一个整数数据成员添加到此类中 -
class A
{
int b;
bool a;
bool c;
};
现在,它将A类的大小显示为8个字节而不是6个字节。为什么编译器在第二种情况下进行填充&amp;为什么不在第一种情况下?
答案 0 :(得分:3)
结构的大小是具有最大对齐要求的数据成员的对齐要求的倍数。这样,当使用结构数组时,数组的元素之间没有填充,并且满足结构的每个数据成员的对齐要求。
在第一种情况下,最大对齐要求是alignof(bool)
,即1,因此结构的大小是1的倍数。
在第二种情况下,最大对齐要求是alignof(int)
,即4,因此结构的大小是4的倍数。
尝试添加double
成员,对齐要求为8。
最小化结构中填充的经验法则是将数据成员从最大的对齐要求排列到最小的对齐要求,例如,双打之后是指针,然后是多头,然后是整数,然后是短线,然后是布尔,然后是字符。
答案 1 :(得分:2)
想象一下,你有一个A
的数组。如果没有额外的填充,则数组中的第二个A
将使其成员b
未对齐。那说编译器可以选择它的感觉。未对齐访问成本运行时,填充成本空间。您的编译器喜欢运行时。
答案 2 :(得分:1)
编译器必须做的唯一事情是对齐第一个成员,以便该成员的地址与结构的地址相同和保持顺序class
指定的成员。
除了这些之外,编译器可以自由地做它想做的事情(除非你使用不同于编译器的编译指令来告诉它)。它可能会打包成员以优化运行时速度。