10

这是一个简单的问题。先上代码。

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 编译的。

4

3 回答 3

9

聚合的对齐是它最严格的成员(具有最大对齐要求的成员)的对齐。换句话说,结构的大小是其最严格(具有最大对齐要求)成员对齐的倍数。

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 的倍数(在我的环境中对齐双精度)。

我写了一篇关于内存对齐的博客文章以获得更详细的解释 http://evpo.wordpress.com/2014/01/25/memory-alignment-of-structures-and-classes-in-c-2/

于 2012-10-02T01:33:28.287 回答
2

将结构对齐到一个字的大小,这里是 4 个字节。

于 2012-10-02T01:06:06.633 回答
-1

查看结构的定义,您有 1 个字节的值,后跟 4 个字节的整数。该整数需要在 4 字节边界上分配,这将强制编译器在 1 字节布尔值之后插入 3 字节填充。这使得结构的大小为 8 个字节。为避免这种情况,您可以更改结构中元素的顺序。

同样对于返回不同值的两个 sizeof 调用,您确定这里没有错字,并且您没有采用指针大小或不同类型或某些整数变量。

Rohit J 回答的struct size 与 typedef 版本不同?

于 2012-10-02T01:10:43.397 回答