全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:961
推到 Plurk!
推到 Facebook!

有關structure大小的問題

答題得分者是:blk5743
jamlee
一般會員


發表:10
回覆:5
積分:3
註冊:2004-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-07 09:26:41 IP:59.112.xxx.xxx 未訂閱
為什麼這樣的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-07 09:43:42 IP:61.66.xxx.xxx 未訂閱
Project->Options...->Advanced Compiler->Data Alignment->BYTE 這樣會得到第一個結構是203,第二個是206
zilch
中階會員


發表:5
回覆:87
積分:78
註冊:2002-09-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-07 09:48:28 IP:218.166.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-07 10:01:12 IP:59.112.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-07 10:20:15 IP:61.66.xxx.xxx 未訂閱
引言: 所以如果我的結構是要用來做tcp protocol的package的format的話就應該選擇用BYTE的方式來compiler這樣server收到封包時才能依照定好的format格式來parse封包?
沒錯,雖然QUAD WORD會比較有效率,可是在你使用耶些API時會產生錯誤 (Memory Size Error),而會導致編譯錯誤。 所以要用QUAD WORD(一般)或BYTE(一些特殊的應用)就是狀況吧。
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-09 00:24:08 IP:221.169.xxx.xxx 未訂閱
基本上,這些說法都正確。 可是,還有兩種情況可以解決。 一個是在送出 STRUCT 內容時。一個一個送。不要一次以 SIZEOF(STRUCT)這種方法。 就可以解決了。 另一個是。。。。。。。記得我曾用過在宣告時加上某個關鍵字。這樣就可以強制 COMPILER 在編譯時做”緊密排列。這樣就可以解決它因為”對齊”而計算錯誤的問題了。PS。那次的案子是在 gcc MIPS,在 C Builder 有沒有這個功能就不知道了。至於關鍵字。。。。對不起。人老了。無法記得兩年多前所寫的程式了。只記得有這個方法。。。。。。。提供大家參考。
fullgui
一般會員


發表:22
回覆:28
積分:10
註冊:2003-04-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-10 10:40:08 IP:61.61.xxx.xxx 未訂閱
不好意思插個花,我在做windows和linux網路訊息傳遞時也碰到這個問題,若BCB可以在Options對話框中修改Advanced compiler頁中的Data alignment為按字節對齊,那Microsoft 的VC 的設定要在哪裡改呢?因為對於同一個structure,vc 算的sizeof為120,而我自己算和gcc的sizeof都是116。不知大大是否知道哪裡可以設定,謝謝。
系統時間:2024-06-15 9:35:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!