資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小!
這時我才想起乙個人, stanley b. lippman,他寫的那 一本書 "inside object modale", 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化, 利用sizeof 可以得出不同的計算機上對 struct 的結 構優化後的大小值.以前是看過,但是,卻沒有深刻理會,現在,吃了 苦頭,才明白!
這是我的理解,c++ 編譯器為了使cpu的效能達到最佳, 會對 struct 的記憶體結構進行優化,這是為了達到cpu 資料傳輸匯流排的吞吐值,各個計算機的資料傳輸匯流排是不一樣的, 如32位的計算機的資料傳輸值是4 bytes,64位計算機 資料傳輸是 8 bytes,這樣,struct 在預設的情況上,編譯器會對 struct 的結構進行資料對齊((32位機)4的倍數或(64 位機)8的倍數),如下面這段**所示:
#includetypedef struct tagpackage package, * lp_package;
int main()
#pragma pack(push)#pragma pack(1)
typedef struct tagpackage package, * lp_package;
#pragma pack(pop)
typedef struct tagpackage2 package2, * lp_package2;
int main()
對指定的資料報編譯時進行記憶體對齊,這樣,也不會對 編譯對其資料進行優化!
總結:
c++的編譯器總是在背後做了很多事!網路資料處理或 與內嵌式裝置打交道的時候,這更應該小心!
關於記憶體對齊
早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...
關於記憶體對齊
資料傳送到網路板的資料報大小根本不是實際控制資料報的大小 這時我才想起乙個人,stanley b.lippman,他寫的那一本書 inside object modale 曾經提過這樣的事情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上對 s...
關於記憶體對齊
首先由乙個程式引入話題 1 環境 vc6 windows sp2 2 程式13 include 45 using namespace std 67 struct st1 8 1314 struct st215 20 21int main 2227 程式的輸出結果為 sizeof st1 is 12 ...