c语言结构体彻底掌握,c语言结构体定义

这个文章主要给大家讲解c语言结构体彻底掌握,和c语言结构体定义的知识点,希望对各位有所帮助。


介绍

作为日常开发中使用最广泛的数据类型之一,结构的重要性不言而喻。上一篇文章我们介绍了结构体的定义、变量的初始化以及结构体元素的访方法。今天我们就来深入探讨一下结构对齐的相关题。这也是很多小伙伴在写代码时经常忽略的一个细节,从而导致各种Bug。也是很多面试、笔试中经常遇到的题之一。一。letincludelt;stdiohgt;//默认还是4字节对齐structtest1;intmainvoid分析第一行boxes包含4个小格子,第一行boxes包含元素a的1个格子,共有3个格子左,而元素b可以用来占据2个格子,剩下的一个格子已经不能容纳元素c占据2个格子了,所以开始一个新的大盒子,先容纳元素c2个格子,然后剩下的2个格子网格,然后我们可以安装元素d[0],d[1],然后用一个新的大盒子来容纳元素d[2]。此时还剩下3个格子,元素e的4个格子已经容纳不下了,只好用一个新的大盒子来完全装下。最后的盒子里,我们启用了4个大盒子,即44个小格子=16字节,上图中的

编译并运行

设置对齐指令

对齐多少字节是由编译器管理的,因此我们可以通过一些编译器指令来设置。这里我们以gcc编译器为例

首先

一般C语言编译都支持该指令,如gcc、ARMCC编译器

//设置为n字节对齐pragmapack这种写法以prgamapack结束,这个范围内的代码按照n对齐来访。通过一个例子来感受一下

pragmapack1structtest;pragmapack1设置为1字节对齐访,我们看一下运行结果

结果是5,和我们默认的4字节对齐结果8不同,现在大家应该能明白原因了。

第二种

事实上,现在越来越多的推荐对齐指令用于特定的数据类型

//设置n字节对齐__attribute__alignedn//取消n字节对齐__attribute__packed注意使用__attribute__packed的时候,是直接放在类型定义后面进行内存对齐的,然后只有这个东西加了这个类型才起作用。Packed的作用是取消对齐访。通过例子感受一下

pragmapack1__attribute__aligned1structtest1__attribute__packed;//pragmapackintmainvoid编译运行结果

我们通过__attribute__aligned1设置1字节对齐,即结构体变量占用的内存空间a1字节+b2字节+c2字节+d三个元素,3字节+e4字节=12字节,一模一样。

思考与总结

为什么需要设置对齐访,什么情况需要设置以及设置多少字节对齐?

事实上,对齐访的主要原因是要与硬件配合,也就是说硬件本身有物理。如果对齐和访会提高效率,否则会大大降低效率。例如,在lcd驱动代码中,相关缓存数据往往设置为512或更多字节对齐,以达到更好的刷新率。综上所述,空间换取性能,让MMC、Cache等硬件获得更高的速度和效率。


今天c语言结构体彻底掌握的详细内容就聊到这里吧,感谢你花宝贵的时间阅读本文,更多关于c语言结构体定义、c语言结构体彻底掌握的相关信息请持续关注本站。

除非特别注明,本站所有文字均为原创文章,作者:admin

No Comment

留言

电子邮件地址不会被公开。 必填项已用*标注

感谢你的留言。。。