结构体对齐为什么那么重要?_环球播资讯
你觉得这俩结构体所占内存是一样大吗?其实不是!
(资料图)
好像也没什么啊,一不一样大对于C语言程序员有什么所谓!
也许你还还感觉不到,上段代码:
对于32位系统,s2的大小为8K,而s3的大小为12K,一放大,就有很明显的区别了。
再举个例子:
你以为,通过总线的方式可以随便访问一个地址吗
但是,为了提高访问速度,其设计是这样的:
不要瞎猜,直接上代码。每个平台都不一样,请读者自行测试,以下我是基于Windows上MinGW的GCC测的。
结果是:
这些内容不用记住,不同平台是不一样的,使用之前,一定要亲自测试验证下。
这里先解释下“模数”的概念:
平台 | 长度/模数 | char | short | int | long | float | double | long long | long double |
Win-32 | 长度 | 1 | 2 | 4 | 4 | 4 | 8 | 8 | 8 |
模数 | 1 | 2 | 4 | 4 | 4 | 8 | 8 | 8 | |
Linux-32 | 长度 | 1 | 2 | 4 | 4 | 4 | 8 | 8 | 12 |
模数 | 1 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | |
Linux-64 | 长度 | 1 | 2 | 4 | 8 | 4 | 8 | 8 | 16 |
模数 | 1 | 2 | 4 | 8 | 4 | 8 | 8 | 16 |
本文的的例子我用的是MinGW32的GCC来测试,你猜符合上表的哪一项?
别急,再看一个例子:
结果是:
很明显,上表没有一项完全对应得上的。简单汇总以下我测试的结果:
长度/模数 | char | short | int | long | float | double | long long | long double |
长度 | 1 | 2 | 4 | 4 | 4 | 8 | 8 | 12 |
模数 | 1 | 2 | 4 | 4 | 4 | 8 | 8 | 8 |
所以,再强调一下:因为环境的差异,在你参考使用之前,请自行测试一下。
例如
32位系统中,它们内存是这么对齐的:
简单解释下:
S2中的元素e_int是按4字节对齐的,其地址位4整数倍,而e_char1和e_char2就按1字节对齐,紧跟其后面就可以了;
而S3中的元素e_char1是按1字节对齐的,放在最前面,而e_int是按4字节对齐的,其地址位4整数倍,所以,只能找到个+4的位置,紧接着e_char2就按1字节对齐,跟其后面就可以了。
那么sizeof(s2)和sizeof(s3)各是多少怎么算?
也很简单,例如这个32位系统,为了提高执行效率,编译器会让数据访问以4字节为单位的,所以S2里有2个字节留空,即sizeof(s2)=8,而sizeof(s3)=12。
是不是很简单呢!
接着,来个复杂一点的:
其内存分布如下:
得出结果:
得出结论:结构体内的结构体,结构体内的元素并不会和结构体外的元素合并占一个对齐单元。
首先,不推荐记忆这些条条框框的文字,以下内容仅供参考:
里面涉及到很多测试源码,如果想要获取的话,可以关注公众号,回复"struct"即可获得下载链接。
标签:
为您推荐
-
人民网杭州9月17日电 (记者孙博洋)9月16日至17日,中国质量(杭州)大会在浙江杭州举行。在16日举行...
2021-09-18