2012-10-02 71 views
6

这是一个简单的问题。先编码。C++ 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编译的。

+0

这就是所谓的填充。 – Marlon

+0

@Marlon所以,填充的主要目的是什么? – Sungmin

+0

@Sungmin:想想数组。 –

回答

6

的集合体的排列回答是,其严格的构件(具有最大对齐要求的成员)的。换句话说,结构的大小是其最严格(具有最大对齐要求)成员的对齐的倍数。

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/

+0

这不是最长的类型;它是对齐“最严格”(即最长)的类型的对齐方式。在许多ABI中,例如,double的长度为8个字节,但只有4个字节对齐。 (理论上讲,它应该是所有路线的LCM,但是标准要求“每个定线值应该是两个非负整数幂”(3.11,第4段),所以你可以选择最长的一个。) – rici

2

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

+0

我可以再问一次吗?对齐结构的原因是什么? – Sungmin

+0

这不解释对齐策略或可能是答案不完整。如果它对齐到4,那么struct B也会是4个字节。但是,它的大小是1个字节。同样在我的回答中,我证明了编译器对齐了8个字节,而不是4。我的观点是,它将结构的大小与它包含的最大类型的倍数对齐。这更好地解释了它。 – evpo

-1

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

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

通过罗希特夏尔J于struct size is different from typedef version?

+0

在我的情况下,改变struct C中元素的顺序并不影响结果。 – Sungmin

+0

@Sungmin:成员的顺序通常不会影响填充。考虑如果'int'必须对齐到一个4字节的边界,它可以被命令为'bool',padding,'int';或'int','bool',填充。请注意,在一个数组中,每个元素的位置都是'sizeof(type)'字节。 –

+0

@Sungmin:你说的没错。在这种情况下,改变顺序不会改变'struct'的大小。 –