首页  >  文章  >  后端开发  >  对于具有三个“unsigned Short”成员的结构,为什么“sizeof(myStruct)”返回 6 个字节而不是 8 个字节?

对于具有三个“unsigned Short”成员的结构,为什么“sizeof(myStruct)”返回 6 个字节而不是 8 个字节?

Susan Sarandon
Susan Sarandon原创
2024-10-26 19:17:02692浏览

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

C 结构中的内存对齐:了解大小差异

使用 C 结构时,内存对齐在确定实际大小方面起着至关重要的作用内存中结构体的大小。内存对齐是指将数据结构放置在可被特定边界整除的内存地址中。这确保了高效的数据访问和性能优化。

考虑一个 32 位机器,其中内存对齐通常设置为 4 字节。在此上下文中,由多个无符号短成员组成的结构,例如:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

人们预计该结构的内存大小为 8 字节(3 x 2 字节)。但是,sizeof(myStruct) 运算符仅返回 6 个字节。这种差异可以归因于对齐要求。

在第一个示例中,每个短成员占用 2 个字节。由于对齐边界是 4 个字节,因此成员之间不会插入任何填充。因此,总大小保持在 6 个字节。

相反,向结构体引入 int 成员(如下所示)会改变对齐行为:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

在这种情况下, int 成员需要 4 字节对齐边界。为了确保满足此要求,在最后一个无符号短成员 (v3) 和 int 成员 (i) 之间插入 2 个字节的填充。这导致总大小为 12 个字节(6 个字节的 Shorts 数据、2 个字节的 padding 和 4 个字节的 int 数据)。

因此,两个结构体之间的内存大小差异来自于其成员类型的对齐要求。在第一个结构中,对齐边界由短成员本身满足,而在第二个结构中,需要额外的填充来满足 int 成员的对齐边界。

以上是对于具有三个“unsigned Short”成员的结构,为什么“sizeof(myStruct)”返回 6 个字节而不是 8 个字节?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn