C语言结构体

结构体偏移量

  • 结构体偏移量指的是结构体每个成员相对于结构体整体的首地址的一个偏移量,因此,第一个成员的偏移量肯定为0。
  • 知道某个成员的偏移量,再知道该成员的类型,就可以很方便地通过解引用来取出该成员。

结构体字节对齐

  • 使用sizeof计算结构体变量占用空间时,不能将结构体中所有成员占用空间简单相加。
  • 理论上讲,任何变量都可以从任意地址开始存储,但实际并非如此。特定类型的变量只能在特定的地址访问(比如,占4个字节的int类型其存储首地址一定是4的倍数,即某类变量存储的首地址一定是它占用空间大小的整数倍,这个规则是基本数据类型的对齐规则,这样做的效果是,cpu在读取数据的时候速度会快很多,原因是CPU是按块读取内存中的内容的,即32位CPU一次可读取4个字节,64位一次可读取8个字节),这需要各个变量在空间上按一定的规则排列,而不是简单顺序排列,这就是结构体的内存对齐。

内存对齐规则

对于基本数据类型

  • 它的地址只要是它的长度的整数倍即可。

对于非标准数据类型,比如结构体等,遵循以下对齐原则。

数据成员对齐规则

  • 第一个数据成员放在偏移量为0的地方,以后每个数据成员放在偏移量为 min(当前成员大小,#pragma pack(n))整数倍 的地方开始,比如int在32位机器中为4字节,#pragma pack(2),那么从2的整数倍的地方开始存储。

结构体总的大小

  • 即sizeof(结构体)的结果,必须是 min(结构体内部最大成员,#pragma pack(n))的整数倍,不足要补齐。

结构体作为成员的对齐规则

  • 如果一个结构体B里嵌套另一个结构体A,此时把A看成一个成员,仍需要满足上边两个条件,且A本身也要满足上边两个条件。

手动设置对齐模式

#pragma pack(show)

  • 显示当前系统的对齐系数,以warning message的形式显示

#pragma pack(push/pop)

#pragma pack(n)

  • 指定packing的数值,以字节为单位,缺省值是8,合法数值为1,2,4,8,16
posted @   肖肖凯  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示