C/C++ - 結構體實際申請的空間

C/C++ - 結構體實際申請的空間

  1. 以下的結構體,sizeof()大小,實際申請的空間以及理論上申請最佳空間
struct Spot
{
    int x;
    int y;
    bool visible;
    int red;
    int blue;
    int green;
    double alpha;
    bool cleaned;
};

在分析前,要先了解下Data structure alignment概念ubuntu

  • 簡單來講,就是由於CPU訪問內存時是成塊成塊讀取數據的,因此編譯器爲了讓CPU訪問的時候更加方便些(同時也使得程序更加高效些),會將變量的內存地址移動到2的N次冪上。而爲此空出來的空間叫作padding,在計算結構體總大小的時候,也得考慮這些padding。

  • 簡單說,假設CPU每次讀取內存都是讀4個字節,那麼要把變量內存地址移到4的倍數上。不過在64位系統中,CPU每次能夠讀取8個字節,因此8個字節的double變量地址要位於8的倍數上。一個個變量算下來,最後就會獲得結構體的實際大小了。

1. 計算理論上的最佳值:

  1. int --> 4 Byte
  2. bool --> 1 Byte
  3. double --> 8 Byte

因此理想最佳值爲:4+4+1+4+4+4+8+1 ==> 30segmentfault

2.sizeof() 程序輸出結果(在64位機器ubuntu上測試)輸出結果

  • 測試機器:ubuntu x64
  • 編譯器:gcc4.8.2
      最終結果是:40

3.根據Data structure alignment在如下平臺分析

  • 測試機器:ubuntu x64
  • 編譯器:gcc4.8.2

由於在64位機器上運行,因此CPU每次能夠讀取8個字節,也就意味着每8個字節位一組數據。測試

int x和int y做爲1組。
bool visible ---> 1 Byte
int red ---> 4 Byte
int blue ---> 4 Byte
由於visible+red ---> 5 Byte,沒到8 Byte 因此後面能夠在追加字段,可是visible + red + blue --> 9 Byte 超出8Byte 因此這裏分紅兩組,visible + red 一組,blue爲另一組優化

依次類推:最終結果和sizeof()結果一致spa

後記:對於Spot結構的優化

struct Spot
{
  double alpha;
    int x;
    int y;
    int red;
    int blue;
    int green;
    bool cleaned;
    bool visible;
};
  • 參考http://segmentfault.com/blog/spacewander/1190000000753849
相關文章
相關標籤/搜索