首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么C中的结构大小不等于所有变量大小之和;

为什么C中的结构大小不等于所有变量大小之和;
EN

Stack Overflow用户
提问于 2010-11-16 06:24:41
回答 4查看 1.2K关注 0票数 1

可能重复:

Why isn't sizeof for a struct equal to the sum of sizeof of each member?

这是我的结构,它的大小是40,但是所有变量的大小都是34。如何消除这个结构的额外空间?

代码语言:javascript
运行
复制
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;
EN

Stack Overflow用户

发布于 2010-11-16 06:27:45

这是因为编译器可以自由地插入填充以满足对齐要求。你有几个选择。

第一种方法本质上是不可移植的,但许多实现提供了如下内容:

代码语言:javascript
运行
复制
#pragma pack

它将试图把结构尽可能的紧凑。请注意,这可能会减慢您的代码速度,这取决于体系结构。

另一种方法是将所有排列最一致的元素放在最前面,例如:

代码语言:javascript
运行
复制
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;

如果注释中有可能出现偏移,那么ULONGLONG是8字节,ULONG是4,USHORT是2。这并不一定会删除所有填充,但它将使编译器更容易将其最小化。

票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4191679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档