首页 > 编程语言 > 详细

c++内存对齐

时间:2020-10-13 21:32:50      阅读:44      评论:0      收藏:0      [点我收藏+]

内存对齐的原因

为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。因为为了访问未对齐的内存,处理器需要作两次内存访问。然而,对齐的内存访问仅需要一次访问。

内存对齐的规则

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

普通结构体

一般c++编译器默认的内存的对齐值为8个字节。对于下面的TEST结构体。因为其第一个字段为char所占字节为1,而第二个字段为int在32位系统中占4个字节,默认对齐值为8,宏观对齐值为4。因为char cNum1的字节大小为1地址为0x00AFFC50,所以其对齐值为1。int cNum2占4个字节所以对齐值为4,所以其首地址要能被4整除所以0x00AFFC51-0x00AFFC53用0xCC填充用来对齐。结构体总体大小为实际宏观对齐值与默认对齐值中较大的那个,所以sizeof(TEST)的大小为0x8.
技术分享图片

结构体中含有数组

如果结构体宏含有数组则用数组的类型参与对齐值的计算,不能按数组的总大小参与对齐值的运算。

结构体中含有结构体

如果结构体中含有结构体则应用结构体的对齐值参与对齐值的运算,而不能用结构体的大小参与对齐值的运算。

c++内存对齐

原文:https://www.cnblogs.com/revercc/p/13810678.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!