上星期在寫通訊有關的程式時
在發送端用memcpy將要送出去的結構複製到一維陣列之中
突然發現結果跟預期的不大一樣
原因在於compiler為了效能考量會自動做最佳化,也就是記憶體對齊
像下面這程式
typedef struct{ int main(int argc, char* argv[]) |
int應該是4個byte char應該是1個byte A_Struct大小應該是5個byte
但是實際執行的結果卻是sizrof(A_Struct)=8
看MSDN上的說明圖例會更清楚
http://msdn2.microsoft.com/zh-cn/library/71kf49f1(vs.80).aspx
所以將結構用memcpy複製到一維陣列之中
才會發生預期之外的執行結果
在BCB上,跟志堅學到用#pragma pack指示編譯器記憶體對齊的方式
並且在使用memcpy時,對傳進去的前兩個參數強迫轉型成 (char*)
這樣memcpy就會乖乖的一個byte一個byte拷貝
這類在撰寫通訊有關程式結構記憶體對齊的問題,在VC之中
可以在結構定義之後加上 __attribute__((packed))
如此就可以把struct放進符合packet格式的大小
了解所使用語言的特性
了解所用編譯器的特性
了解編譯後到底產生什麼碼
了解編譯器對程式碼做了哪些最佳化
當程式寫越多… 就會越發現 自己其實不會寫程式 (真是慘忍的事實)