上星期在寫通訊有關的程式時

在發送端用memcpy將要送出去的結構複製到一維陣列之中

突然發現結果跟預期的不大一樣

原因在於compiler為了效能考量會自動做最佳化,也就是記憶體對齊

像下面這程式

 

typedef struct{
                 int i_value;
                 char c_value;
               }A_Struct;

int main(int argc, char* argv[])
{
        printf("sizeof(A_Struct)=%d\n",sizeof(A_Struct));
        system("pause");
        return 0;
}

  

int應該是4byte   char應該是1byte   A_Struct大小應該是5byte

但是實際執行的結果卻是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格式的大小

 

了解所使用語言的特性

了解所用編譯器的特性

了解編譯後到底產生什麼碼

了解編譯器對程式碼做了哪些最佳化

當程式寫越多  就會越發現  自己其實不會寫程式  (真是慘忍的事實)

 

 

arrow
arrow
    全站熱搜

    志 發表在 痞客邦 留言(2) 人氣()