你觉得这俩结构体所占内存是一样大吗?其实不是!
(资料图片)
好像也没什么啊,一不一样大对于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"即可获得下载链接。
关键词:
4月12日,记者从吉林省召开的新闻发布会获悉,为保证春播面积,不误农时,安全有序开展春耕生产,全省各地坚持应放尽放、应返尽返、应管尽
(4月15日)24时,国内成品油零售价或迎来今年首次大幅下调。据@新华财经官方微博 4月11日报道,当前统计周期已来到第六个工作日,原油变化
疫情期间,民企生产经营遇到哪些难题?如何做好帮扶解困,助力民企稳岗留工?如何进一步提升工会服务水平,服务高质量发展……针对这些问题,