簡體   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