为方便大家好理解,建议看参考4
参考:
1.
struct与字节对齐——深入理解_字节补充-CSDN博客文章浏览阅读300次。本来想自己总结一下的,后来看到知乎有大牛写的总结非常好,转载之。https://zhuanlan.zhihu.com/p/210999004————————————————————————————————————————**一句话总结:编译器下,全体变量成员进行边界(地址)对齐!**两句话解释:①编译器,会先让struct结构体内部成员按顺序进行边界(存放地址)对齐,对齐标准是各自变量类型的长度;②然后再让struct结构体进行最后的字节补充(方便下一个变量对齐),对齐标准是结._字节补充https://blog.csdn.net/huohunri2013/article/details/1116429802.struct 字节对齐详解_struct字节对齐-CSDN博客文章浏览阅读1.2w次,点赞16次,收藏56次。现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的C_struct字节对齐https://blog.csdn.net/zhanghow/article/details/55262988?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-55262988-blog-120701511.235%5Ev39%5Epc_relevant_default_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1-55262988-blog-120701511.235%5Ev39%5Epc_relevant_default_base&utm_relevant_index=23.C语言的sizeof运算符计算结构体大小_sizeof求结构体的大小-CSDN博客文章浏览阅读5.6k次,点赞9次,收藏46次。C语言的sizeof运算符运算规则sizeof运算符**sizeof 是一个运算符,不是函数(方法)。**例子:当想打印一个变量的存储区域大小时,可以直接写int a = 5;printf("%d\n",sizeof a);当想打印一个数据类型的存储区域大小时,因为int是数据类型,所以要加小括号提高int的运算优先级printf("%d\n",sizeof(int));C中不同数据类型所占用的内存大小对于32位系统来说,大小如下(单位:字节)sizeof计算结构体大小结构体的成_sizeof求结构体的大小https://blog.csdn.net/weixin_45244553/article/details/124101673
4.C语言字节对齐、位域、枚举、联合体_联合体字节对齐-CSDN博客
5.C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)_c++算结构体数组的大小-CSDN博客
摘自3:
纠正下3.
错误地方:
纠正后:
看我留下的评论即可,感觉评论最后写的不清楚的也可以看我给出的表格:
我纠正后的表格:
偏移量 补充字节 成员大小 0 0 4 4 0 3 7 1 20 28 4 16 48 0 4 48+0+4=52,结构体的大小必须是展开所有成员大小的整数倍(数据对齐),所以52+4=56,即sizeof(struct aa)=56。
我对参考3评论的原话:
作者,您回答得非常好,但是纠正一下小错误,就是
“sizeof计算结构体中存放结构体”这里
我将您的源代码运行了一遍,结果成员各自的地址是:
0000003DB98FFCB8 (aa.a)
0000003DB98FFCBC (aa.c)
0000003DB98FFCC0 (bb.e)
0000003DB98FFCD8 (bb.f)
0000003DB98FFCE8 (aa.b)
可知,aa.a的偏移量为0
aa.c的偏移量为4
bb.e的偏移量为8
bb.f的偏移量为32
aa.b的偏移量为48
也就是说展开后,各自成员只要符合您说的:
(1)结构体变量中成员的偏移量必须是成员数据类型大小的整数倍(0被认为是任何数的整数倍)
(2)结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
即可。
总之,应该修正为
偏移量 补充字节 成员大小
0 0 4
4 0 3
7 1 20
28 4 16
48 0 4
48+0+4=52,结构体大小必须是展开后所有成员大小的整数倍(数据对齐),所以52+4=56。