之前看到網友推薦的一本電子書
《Linux C编程一站式学习》
http://akaedu.github.io/book/
才知道原來C語言有所謂的 "對齊" alignment
為的是讓記憶體搜尋資料時的速度可以比較快
因此在structure裡面宣告變數時,宣告位置的不同會造成整個structure的size也不一樣
~ $ gcc -o alignment alignment.c && ./alignment
12
------------------------------
因為中間的 char a的大小為1, 編譯器會自動在 變數 a後面加3個bytes的padding 以增進記憶體位置的效率
------------------------------
~ $ gcc -o alignment alignment.c && ./alignment
size of short is 2
size of student structure is 12
------------------------------
在只有宣告一個short變數時,會自動增加2 bytes的padding
但第二個例子,因為後面有宣告short b,所以可以不用增加padding
原則就是structure的整個大小最後一定會是最大size的變數(此處為int) 的 倍數.
來看稍微複雜的例子
------------------------------
struct abc{
int a;
char b;
int c;
char d;
}
------------------------------
size of 為16
------------------------------
struct abc{
int a;
int c;
char d;
char b;
}
------------------------------
size of 為12
------------------------------
第一個為16是因為兩個char變數都有個別去增加3byte的padding,因此為16
第二個為12是因為char b後面只要再增加2個bytes的padding就可以完成對齊了.
=================
在程式碼前面增加一行
#pragma pack(1)
說可以無視alignment這個規定
只要去計算每個變數實際的小大即可
補充:
C語言的sizeof是一個 operator,並不是function(雖然看起來是)
在經過cc這個compiler後,sizeof就會被轉成對應的大小數字.
https://stackoverflow.com/questions/6081842/sizeof-is-not-executed-by-preprocessor
參考:
http://blog.xuite.net/jackie.xie/bluelove/7788211
http://en.wikipedia.org/wiki/Data_structure_alignment
維基百科裡面也有很詳細的介紹
留言列表