[英]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.