資料傳送到網路板的資料報大小根本不是實際控制資料報的大小!
這時我才想起乙個人, 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++的編譯器總是在背後做了很多事!網路資料處理或與內嵌式裝置打交道的時候,這更應該小心!
關於記憶體對齊
資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...
關於記憶體對齊
早上看了乙個貼的面試題,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...
關於記憶體對齊
首先由乙個程式引入話題 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 ...