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

相关推荐
西柚小萌新15 小时前
【Python从入门到精通】--Pycharm增加内存
开发语言·python·pycharm
不爱编程的小九九15 小时前
小九源码-springboot082-java旅游攻略平台
java·开发语言·旅游
只是懒得想了15 小时前
用C++实现一个高效可扩展的行为树(Behavior Tree)框架
java·开发语言·c++·design-patterns
bkspiderx15 小时前
C++设计模式之行为型模式:模板方法模式(Template Method)
c++·设计模式·模板方法模式
我是华为OD~HR~栗栗呀15 小时前
华为OD-23届考研-Java面经
java·c++·后端·python·华为od·华为·面试
yan86265924615 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
mit6.82415 小时前
pq|二维前缀和
c++
Small___ming16 小时前
【Python基础】Python路径操作全解析:os.path、glob与pathlib从入门到精通
开发语言·python
_poplar_16 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
Yupureki16 小时前
从零开始的C++学习生活 7:vector的入门使用
c语言·c++·学习·visual studio