2010-11-16 27 views
1

可能重複:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?爲什麼C中struct的大小不等於所有變量大小的總和;

這是我的結構和它的大小是40,但所有變量的大小是34 我怎麼能消除這種結構的額外空間?

typedef struct 
{ 
USHORT SequenceNumber; 
USHORT LinkCount; 
USHORT AttributeOffset; 
USHORT Flags; 
ULONG BytesInUse; 
ULONG BytesAllocated; 
ULONGLONG BaseFileRecord; 
USHORT NextAttributeNumber; 
USHORT Padding; 
ULONG MFTRecordNumber; 
USHORT UpdateSeqNum; 
} FILE_RECORD_HEADER, *PFILE_RECORD_HEADER; 
+2

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member Dupe? – 2010-11-16 06:25:52

回答

2

這是因爲編譯器可以自由插入填充以兌現對齊要求。你有幾個選擇。

首先是內在不可移植,但許多實現提供類似:

#pragma pack 

將試圖收拾結構儘可能緊密。只是要注意,這可能你的代碼變慢,這取決於架構

另一種方法是把所有的最對齊的元素前面,如:

typedef struct { 
    ULONGLONG BaseFileRecord;    // 0x00 
    ULONG BytesInUse;      // 0x08 
    ULONG BytesAllocated;     // 0x0c 
    ULONG MFTRecordNumber;     // 0x10 
    USHORT NextAttributeNumber;   // 0x14 
    USHORT SequenceNumber;     // 0x16 
    USHORT LinkCount;      // 0x18 
    USHORT AttributeOffset;    // 0x1a 
    USHORT Flags;       // 0x1c 
    USHORT Padding;      // 0x1e 
    USHORT UpdateSeqNum;     // 0x20 
} FILE_RECORD_HEADER, *PFILE_RECORD_HEADER; 

與評論可能偏移,asuming那ULONGLONG是8個字節,ULONG是4和USHORT是2.這不一定會刪除所有填充,但它會使編譯器更容易將其最小化。

0

由於填充。您的結構的大小取決於平臺和編譯器。你爲什麼在乎?你把你的結構視爲二進制數據嗎?

0

對齊+填充。

有兩種方法來解決這個問題:

  1. 通過安排在最大的變量,以最小的訂單減少填充。
  2. 在編譯器中使用非標準打包屬性擴展(對於GCC,使用__attribute__((packed)))。請注意,讀取結構成員的訪問時間將會減少,並且代碼大小會增加(儘管不會像在無法訪問未對齊的單詞的平臺(如ARM)上那樣糟糕)。
相關問題