繁体   English   中英

C ++ sizeof with bool

[英]C++ sizeof with bool

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

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/

将结构与单词的大小对齐,这里是4个字节。

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

同样对于两个返回不同值的sizeof调用,你确定这里没有拼写错误,你没有使用指针大小或不同类型或某个整数变量。

Rohit J对结构大小的回答与typedef版本有什么不同?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM