C++ sizeof 与 bool

标签 c++ boolean sizeof

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

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/

相关文章:

c - sizeof 运算符如何在 C 中工作?

c++ - 在 OS/X(或 Windows)中检测启动期间按住的修改键?

c++ - 如何使运算符重载在友元函数中正常工作?

python - python numpy tolist() 增加了多少开销?

java - 对Java中的字符串感到困惑

JavaScript If/Else 条件和比较 - 差异

c - 如何检查 bool 数组中的所有值是否为真?

c++ - 为什么未关闭的文件大小是 4 个字节

c++ - 为什么结构数组的 memset 会改变程序行为?

c++ - C++ 中符合标准的最小对象大小?