C++内存对齐知识点总结

什么是内存对齐

理论上:32位系统:int 4字节,char1字节

现代计算机内存空间都是按照字节划分的。理论上计算机系统对基本类型数据在内存的变量的访问可以从任何地址开始,但是时机的计算机系统对基本类型的数据在内存中存放的位置是有限制的,它们会要求这些数据的首地址的值是某个数的倍数一般为4或者是8,这就是所谓的内存对齐。

为什么要内存对齐

由于大部分处理器一般会以双字节、4字节、8字节、16字节甚至是32字节为单位来存取内存,我们将上述这些存取单位称之为内存存取粒度。

如果没有内存对齐机制,那么数据任意存放,就会出现,取出的内存块,需要剔除、拼接内存才能得到我们想要的数据,这将导致数据的访问需要做很多的工作。

现在有了内存对齐规则,int类型数据只能存放在按照对齐规则的内存中,比如0地址开始的内存,一次取4字节,直接就一次性将数据读出来了。

内存对齐规则

每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。

有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小 的那个。有效对齐值也叫对齐单位。

内存对齐需要遵循的规则:

(1) 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。

(3) 结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

原文:https://zhuanlan.zhihu.com/p/30007037

相关推荐
感哥3 小时前
C++ 多重继承
c++
博笙困了3 小时前
C++提高编程 4.0
c++
扑克中的黑桃A3 小时前
[C语言]第三章-数据类型&变量
c++
感哥4 小时前
C++ std::string
c++
感哥20 小时前
C++ 面向对象
c++
沐怡旸1 天前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
感哥1 天前
C++ STL 常用算法
c++
saltymilk2 天前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥2 天前
C++ lambda 匿名函数
c++
沐怡旸2 天前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试