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

相关推荐
路溪非溪11 小时前
Python语言的执行流程总结
开发语言·python
民乐团扒谱机11 小时前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb
乐观勇敢坚强的老彭11 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
离陌在学C#12 小时前
C# 泛型:从基础到高级应用
开发语言·c#
ly768912 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
SomeB1oody12 小时前
【RustyML入门】2.13. 孤立森林
开发语言·后端·机器学习·rust·教程
我变成萤火虫12 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
萧瑟余晖12 小时前
Java深入解析篇三十之Java日志框架
java·开发语言
Herbert_hwt12 小时前
【C语言基础】常量、选择结构与运算符全解析
c语言·开发语言·算法
buhuizhiyuci12 小时前
【Linux 篇】数字世界的水流蓄水池 —— IO 缓冲区机制深度实战解析
linux·运维·服务器·c++