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

相关推荐
君顾12 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
南棱笑笑生2 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
平头哥技术团队3 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++3 小时前
【洛谷】kmp算法
开发语言·算法
传奇开心果编程3 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743873 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php
Draw Stars3 小时前
Git BASH安装教程
开发语言·git·bash
vortex54 小时前
一文讲透 Zsh 与 Bash 的区别
开发语言·bash
千谦阙听4 小时前
C++类和对象(中):默认成员函数、构造与析构、拷贝构造、运算符重载
开发语言·c++·学习
weixin_307779134 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab