为什么以下代码中类 cl1 的大小为8而不是5,而类 cl2 的大小为1?
class cl1 {
public:
int n;
char cb;
cl1();
~cl1();
};
class cl2 {
public:
char cb;
cl2();
~cl2();
};
答案 0 :(得分:6)
编译器可以在类成员之间和之后插入填充,以确保变量正确对齐等。确切地说,插入的填充取决于实现。在这种情况下,我猜测编译器在cl1::cb
之后添加3个字节的填充,可能是为了确保内存中的下一个变量在4字节边界上对齐。
答案 1 :(得分:3)
cl1
(n
)的最大成员是4个字节,因此cl1
的大小填充到最接近的4个字节(在本例中为8个),这样一个数组cl1
个对象不会创建未与4字节地址对齐的n
成员。大多数处理器真的讨厌未对齐的多字节值,要么是性能损失(访问一个值需要两个内存周期),要么是彻底崩溃(对齐异常)。
无法保证从编译器到编译器或平台到平台都是一致的。
答案 2 :(得分:2)
这完全归功于填充。可以找到更多信息,例如here
问题是对象及其成员的地址应该针对操作系统和硬件特定原因进行正确对齐。结果如此。 填充问题很复杂,因为数组中的对象必须连续定位,中间没有任何空格,并且ALL应该正确对齐。
答案 3 :(得分:2)
这是因为编译器的结构填充。如果你想删除填充,请尝试#pragma pack(1),你应该按预期得到5和1.
答案 4 :(得分:2)
当你正在探索struct的大小以及填充的方式时,让我告诉你一个有趣的事情。结构的大小不仅取决于成员,,还取决于其声明的顺序。例如,以下结构的大小是不同的,即使两个具有相同类型的相同类型的成员,唯一的区别是它们的声明顺序!
struct A
{
int a;
char b;
char c;
};
struct B
{
char b;
int a;
char c;
};
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl;
输出:
sizeof(A) = 8
sizeof(B) = 12
Ideone的在线演示:http://www.ideone.com/8OoxX