为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和?

sizeof() 获取的结构类型元素的大小并不总是等于每个单独成员的大小。有时编译器会添加一些填充以避免对齐问题。所以尺寸可能会改变。当结构成员后面跟着一个尺寸较大的成员或位于结构末尾时,将添加填充。不同的编译器有不同类型的对齐约束。在 c 标准中,总对齐结构取决于实现。

情况 1

在这种情况下,双精度 z 为 8 字节长,大于 x(4 字节) )。因此又添加了 4 个字节的填充。此外,短类型数据 y 在内存中具有 2 字节空间,因此添加了额外的 6 字节作为填充。

为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和?

示例代码

#include struct myStruct {   int x; //Integer takes 4 bytes, and padding 4 bytes   double z; //Size of double is 8-byte, no padding   short int y; //Size of short is 2-byte, padding 6-bytes};main() {   printf("Size of struct: %d", sizeof(struct myStruct));}

登录后复制

输出2

Size of struct: 24

登录后复制

情况 2

在这种情况下,首先插入双精度数,它占用 8 字节的空间。现在添加了整数 x(4 字节)。所以还有另外4个字节的空间。添加短y后,可以将其放入额外的4字节空间中,总共占用16字节空间。

为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和?

立即学习“C++免费学习笔记(深入)”;

示例代码

#include struct myStruct {   double z; //Size of double is 8-byte, no padding   int x; //Integer takes 4 bytes, and padding 4 bytes   short int y; //Size of short is 2-byte, padding 6-bytes};main() {   printf("Size of struct: %d", sizeof(struct myStruct));}

登录后复制

输出2

Size of struct: 16

登录后复制登录后复制

情况3

第三种情况也占用16字节的内存空间,但排列方式不同。由于第一个成员是double,所以首先放置,然后添加short 类型数据。现在,当整数尝试插入时,可以将其放入剩余的 6 字节区域中。因此,short 之后存在一个填充,但整数数据之后不需要填充。

为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和?

示例代码

#include struct myStruct {   double z; //Size of double is 8-byte, no padding   short int y; //Size of short is 2-byte, padding 6-bytes   int x; //Integer takes 4 bytes, and padding 4 bytes};main() {   printf("Size of struct: %d", sizeof(struct myStruct));}

登录后复制

输出2

Size of struct: 16

登录后复制登录后复制

以上就是为什么在C/C++中,结构体的sizeof不等于每个成员的sizeof之和?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2587399.html

(0)
上一篇 2025年3月6日 15:34:34
下一篇 2025年2月28日 03:57:57

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论