2010-11-16 37 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)上那样糟糕)。
相关问题