2013-07-07 45 views
2

IM有一個結構來表示一個IP報頭SIZEOF不會顯示真實尺寸,試圖實現IP

struct IPHDR // the ip header 
{ 
    unsigned char VER : 4; 
    unsigned char IHL : 4; 
    unsigned char DSCP : 6; 
    unsigned char ECN : 2; 
    unsigned short len; 
    unsigned short id; 
    u_char Reserved:1; //Zeroes 
    u_char DF:1; //Dont Fragment 
    u_char MF:1; //More Fragment 
    unsigned short FragOffset : 13; 
    u_char ttl; 
    u_char protocol; 
    u_short checksum; 
    struct in_addr src; 
    struct in_addr dst; 
} ; 

的sizeof(IPHDR)返回24時,它應該返回20 有什麼不好?

+1

這是因爲你的結構被填充。如果支持,您可以使用'#pragma pack'指令來解決這個問題。在這裏檢查http://stackoverflow.com/questions/8322439/what-is-the-smallest-size-i-can-make-this-structure-on-a-64bit-machine/8322469#8322469 – Cyclonecode

回答

3

這是因爲你的結構被填充爲克服這一點,你可以使用#pragma pack compiler directive像這樣:

#pragma pack(push) 
#pragma pack(1) 
struct IPHDR // the ip header 
{ 
    unsigned char VER : 4; 
    unsigned char IHL : 4; 
    unsigned char DSCP : 6; 
    unsigned char ECN : 2; 
    unsigned short len; 
    unsigned short id; 
    u_char Reserved:1; //Zeroes 
    u_char DF:1; //Dont Fragment 
    u_char MF:1; //More Fragment 
    unsigned short FragOffset : 13; 
    u_char ttl; 
    u_char protocol; 
    u_short checksum; 
    struct in_addr src; 
    struct in_addr dst; 
} ; 
#pragma pack(pop) 

瞭解更多關於填充和對齊:Data structure alignment

1

這是因爲你的結構,被迫memory alignment。總之,結構的總尺寸應該是任何結構構件的最大對齊的倍數。這個要求來自於處理器讀取塊的內存,而不是單個字節。有些人認爲內存分配是現代處理器的限制,通常可以通過執行4次低效的單字節取出而不是一次高效的單詞取出來解決,但許多語言說明者認爲只要取消它們並強制所有內容變得更容易對齊。

通常通過重新實現結構中的字段序列,可以實現結構的不同對齊和大小。

從提供的鏈接:

它可以改變結構的對準以降低它們所需的 存儲器由 重排序結構構件(或符合現有格式)或改變編譯器的對準(或 「包裝」)的結構成員。