有關structure大小的問題 |
答題得分者是:blk5743
|
jamlee
一般會員 ![]() ![]() 發表:10 回覆:5 積分:3 註冊:2004-10-04 發送簡訊給我 |
為什麼這樣的TestSend的size會是208呢?
typedef struct tagTestSend { BYTE GroupCode; unsigned int Reserved2; char UserName[20]; char Password[10]; char DVIPName[60]; char DVIPNumber[40]; char Email[64]; unsigned int StructLen; }TestSend; TestSend *pTestSend; pTestSend = new TestSend; ShowMessage(IntToStr(sizeof(TestSend))); ============================================= 多增加了三個變數,這樣的大小也是208,為什麼呢? typedef struct tagTestSend { BYTE GroupCode; BYTE CommandID; BYTE Flags; BYTE Reserved; unsigned int Reserved2; char UserName[20]; char Password[10]; char DVIPName[60]; char DVIPNumber[40]; char Email[64]; unsigned int StructLen; }TestSend;發表人 - jamlee 於 2005/01/07 09:30:33 |
blk5743
高階會員 ![]() ![]() ![]() ![]() 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
zilch
中階會員 ![]() ![]() ![]() 發表:5 回覆:87 積分:78 註冊:2002-09-24 發送簡訊給我 |
Project->Options->Advance compiler
Data Alignment
byte = 203
word = 204
double word = 208
quad word = 208 計算結構變量的大小就必須討論數據對齊問題。為了CPU存取的速度最快(這同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C 在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。結合你的這個結構,每個char是一個字節,short是2個字節,而int是4個字節,這樣加起來應該是14個字節,可是sizeof返回為16個字節,這就是因為數據對齊,整個數據變量佔據了16個字節,而其中只有14個字節存放數據,例外2個字節浪費了。如果要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁中的Data alignment為按字節對齊。
|
jamlee
一般會員 ![]() ![]() 發表:10 回覆:5 積分:3 註冊:2004-10-04 發送簡訊給我 |
引言: Project->Options->Advance compiler Data Alignment byte = 203 word = 204 double word = 208 quad word = 208 計算結構變量的大小就必須討論數據對齊問題。為了CPU存取的速度最快(這同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C 在處理數據時經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。這樣做可能會浪費一些內存,但理論上速度快了。當然這樣的設置會在讀寫一些別的應用程序生成的數據文件或交換數據時帶來不便。結合你的這個結構,每個char是一個字節,short是2個字節,而int是4個字節,這樣加起來應該是14個字節,可是sizeof返回為16個字節,這就是因為數據對齊,整個數據變量佔據了16個字節,而其中只有14個字節存放數據,例外2個字節浪費了。如果要按字節存儲,而不進行數據對齊,可以在Options對話框中修改Advanced compiler頁中的Data alignment為按字節對齊。所以如果我的結構是要用來做tcp protocol的package的format的話就應該選擇用BYTE的方式來compiler這樣server收到封包時才能依照定好的format格式來parse封包? 發表人 - jamlee 於 2005/01/07 10:05:32 |
blk5743
高階會員 ![]() ![]() ![]() ![]() 發表:34 回覆:371 積分:236 註冊:2003-11-17 發送簡訊給我 |
|
暗黑破壞神
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
基本上,這些說法都正確。
可是,還有兩種情況可以解決。
一個是在送出 STRUCT 內容時。一個一個送。不要一次以 SIZEOF(STRUCT)這種方法。
就可以解決了。
另一個是。。。。。。。記得我曾用過在宣告時加上某個關鍵字。這樣就可以強制 COMPILER 在編譯時做”緊密排列。這樣就可以解決它因為”對齊”而計算錯誤的問題了。PS。那次的案子是在 gcc MIPS,在 C Builder 有沒有這個功能就不知道了。至於關鍵字。。。。對不起。人老了。無法記得兩年多前所寫的程式了。只記得有這個方法。。。。。。。提供大家參考。
|
fullgui
一般會員 ![]() ![]() 發表:22 回覆:28 積分:10 註冊:2003-04-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |