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的倍數上。一個個變量算下來,最後就會獲得結構體的實際大小了。
因此理想最佳值爲:4+4+1+4+4+4+8+1 ==> 30segmentfault
由於在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
struct Spot { double alpha; int x; int y; int red; int blue; int green; bool cleaned; bool visible; };