这是一个简单的问题。先写代码。
struct A {
int x;
};
struct B {
bool y;
};
struct C {
int x;
bool y;
};
在主函数中,我调用
cout << " bool : " << sizeof(bool) <<
"\n int : " << sizeof(int) <<
"\n class A : " << sizeof(A) <<
"\n class B : " << sizeof(B) <<
"\n class C : " << sizeof(C) << "\n";
结果是
bool : 1
int : 4
class A : 4
class B : 1
class C : 8
为什么 C 类的大小是 8 而不是 5? 请注意,这是在 MINGW 4.7/Windows 7/32 位机器上使用 gcc 编译的。
最佳答案
聚合的对齐方式是其最严格的成员(具有最大对齐要求的成员)的对齐方式。换句话说,结构的大小是其最严格(具有最大对齐要求)成员对齐的倍数。
struct D
{
bool a;
// will be padded with char[7]
double b; // the largest alignment requirement (8 bytes in my environment)
};
上面结构的大小将是 16 个字节,因为 16 是 8 的倍数。在您的示例中,最严格的类型是 int 对齐到 4 个字节。这就是结构被填充为 8 个字节的原因。我再举一个例子:
struct E
{
int a;
// padded with char[4]
double b;
};
上面结构体的大小是16,16是8的倍数(我环境中double的对齐方式)。
我写了一篇关于内存对齐的博文以获得更详细的解释 http://evpo.wordpress.com/2014/01/25/memory-alignment-of-structures-and-classes-in-c-2/
关于C++ sizeof 与 bool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683215/