C++面经之----------内存对齐

C++内存对齐 这里写目录标题空类/静态成员内置类型数据成员结构体数据成员虚函数继承内存对齐的意义 内存对齐的基本原则: 结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置要从自身大小的整数倍开始存储。 如果一个结构A里有结构体成员B,则结构体A的成员要从结构体B内部“最宽基本类型成员”的整数倍地址开始存储(如struct a里存有struct b,b里有char, int, double等元素,那b应该从8的整数倍位置开始存储)。 结构体的总大小为结 阅读详情

内存对齐

为什么需要内存对齐

尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.

现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4的倍数的内存开始读取数据。

假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作.

也就是说内存对齐以后可以增加我们访问数据的效率,也就是为对我的内存处理器需要做两次操作而对齐的内存处理器只需要做一次操作,第二个就是,有的机器只能从某个数的整数倍进行寻址,如果不是内存对齐,那么不同机器的代码可能不能运行

结构体对齐规则

参考链接

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

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

  • 第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  • 结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  • 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

对齐数: 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值

结构体大小计算大小三部曲

struct S
{
	double d;
	char c;
	int i;
};
第一步:找出每个成员变量的大小将其与编译器的默认对齐数相比较,取其较小值为该成员变量的对齐数

VS默认对齐数是8

第二步:根据每个成员对应的对齐数画出它们在内存中的相对位置

第三步:通过最大对齐数决定最终该结构体的大小
通过图我们可以知道,绿色部分(double d成员占用)+红色部分(char c成员占用)+紫色部分(int i成员占用)+红色与紫色之间的白色部分(浪费掉了)总共占用了16个字节的内存空间。
我们需要将它们总共占用的内存空间(16)与结构体成员的最大对齐数(8)相比较,结构体的总大小为最大对齐数的整数倍,此时16正好是8的整数倍,所以该结构体在VS编译器下的大小就16个字节。即创建一个该类型的结构体变量,内存需为其开辟16个字节的内存空间。

注意:大多数情况下,成员变量已经占用的总字节个数并不一定正好为其成员变量中的最大对齐数的整数倍,这时我们需要将其扩大为最大对齐数的整数倍。

变量类型占用内存大小

参考链接

类型占用字节
char1
short int2
int4
long4
flaot4
double8
long long8

int 的范围大概是

-2e9~2e9

long long 范围

-9e18~9e18

C/C++ 内存对齐 什么是内存对齐 为了提高程序的性能,数据结构应该尽可能地在自然边界上对齐。 为什么需要内存对齐 1、便于移植:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、提高处理器访问速度:对于未对齐的内存,处理器可能需要访问两次内存才能将数据完全读出,而对于对齐的内存,处理器只需要一次即可。 对于原因2具体解释一下: 尽管内存是以字节为单位,但是大部分CPU并不是按字节块来存取内存的。它一般会以2的n次方个字节为单位来存取内存,将上述这些存取 阅读详情

相关推荐

C++ 内存对齐:alignas 与 alignof

内存对齐是指数据在内存中按照特定的字节边界存储。一般情况下,处理器从内存读取数据时会更高效地读取对齐的数据。如果数据未对齐,处理器可能需要进行额外的内存访问,导致性能下降。对于某些平台,不对齐的内存访问甚至可能引发未定义行为。通常,C++ 编译器会根据目标平台自动对变量进行内存对齐,确保类型的内存地址是适当的对齐边界。但有时,开发者需要对内存对齐进行精确控制,比如优化性能、与硬件设备交互等场景,这就是alignas和alignof的用武之地。

T 2446

C/C++ 面试-内存对齐 即不同数据类型存储空间

下面列举了Dev-C++下基本类型所占位数和取值范围: 基本型 所占位数 取值范围 输入符举例 输出符举例 -- -- char 8 ...

weixin_34041003的博客 166

C++结构体内存对齐规则

C++结构体内存对齐规则

光阴迷客的知识库 1146

C++常见面试问题之内存对齐

2.如果数据是从1字节开始的,就首先要将前 4 个字节读取到寄存器,并再次读取 4-7 个字节数据进入寄存器,接着把0字节,5,6,7字节的数据剔除,最后合并 1,2,3,4 字节的数据进入寄存器,所以说,当内存没有对齐时,寄存器进行了很多额外的操作,现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

weixin_57672347的博客 481

C++经典面试题之深入解析内存对齐

众所周知,为了保证每个对象拥有彼此独立的内存地址,C++空类的内存大小为1字节。而非空类的大小与类中非静态成员变量和虚函数表的多少有关。其中,类中非静态成员变量的大小则与编译器的位数以及内存对齐的设置有关。

╰つ栺尖篴夢ゞ 1098

KANO分析模型

KANO分析模型的基本概念,目的意义,应用场景,实现方法和示例等

JasonH2021的博客 3067

c++面试问答:内存对齐

所谓的内存对齐,就是为了让内存存取更加有效率而采取的一种优化手段,对齐的结果是使得内存中数据的首地址是CPU单次获取数据大小的整数倍。比如,CPU单次获取数据的大小是4个字节,对于 int x 而言,如果 x 的地址是0x00000000、0x00000004...等4的倍数,就是内存对齐。此外,这里说的内存对齐,一般就是针对结构体来进行探讨的,所以这就可以理解在本文后面提到的对整体和成员有不同的对齐方式了。

实践出真理,接毕设/课设项目开发指导 456

如何通过常规测井曲线识别砂岩、泥岩、碳酸盐岩和煤层

常规测井曲线通过不同岩性的物理性质差异识别砂岩、泥岩、碳酸盐岩和煤层。砂岩表现为低自然伽马(GR)、中等密度(RHOB)和声波时差(DT);泥岩以高GR、高中子(NPHI)和高DT为特征;碳酸盐岩显示低GR、高RHOB和低DT;煤层则具有极低RHOB、极高NPHI和DT的独特组合。综合GR与三孔隙度曲线(RHOB、NPHI、DT)可有效区分岩性,其中密度测井对煤层识别最可靠。电阻率(RT)曲线辅助判断流体性质,但需结合其他参数综合分析。

love code, love life. 2593

突破编程_C++_面试(结构体)

c++ 面试:结构体

突破编程 1516

保姆级教程:断网环境下用Flexnet服务器搞定SolidWorks 2021安装与破解(附错误5解决方案)

本文提供SolidWorks 2021在断网环境下的企业级部署指南,详细解析Flexnet服务器本地化工作原理,并给出安装与破解的实战方案,特别针对常见的'错误5'问题提供多维度解决方案。适用于需要内网隔离或移动办公的工业设计场景,确保数据安全与授权合规。

weixin_28683391的博客 299

避坑指南:用Adams做滚珠丝杠仿真时90%人会遇到的3个建模错误

本文针对使用Adams进行滚珠丝杠动力学仿真时常见的三大建模错误,提供了详细的避坑指南。重点解析了如何避免因直接导入CAD几何体导致的性能与精度问题,科学设置接触参数以提升计算效率与结果平滑度,以及通过规范的命名与组织管理模型,确保仿真过程高效可靠。

gin88的博客 573

【C++指南】C++中的内存对齐规则及原因详解

在计算机科学中,内存对齐是一种数据存储方式,它要求某些类型的数据必须存储在特定地址上。这种要求是由硬件架构决定的,不同的处理器可能有不同的对齐要求。C++作为一种底层抽象程度较高的编程语言,允许开发者通过编译器选项或特定语法来控制数据的内存布局,以满足这些硬件需求。 本文将详细介绍C++中的内存对齐规则及其背后的原理。

倔强的石头的博客 3525

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4829

C++ 内存对齐

二、内存对齐规则 首先了解两个概念: 1.每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。32位系统,gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。 2.有效对齐值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。 然后明确内存对齐的两个规则: 1.结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 off

weixin_43816121的博客 4904

YOLOv11改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 3053

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7723

【C++】内存对齐

本篇文章介绍C++中的内存对齐,后续介绍C的union和C++的variant的时候,需要用到这部分的知识。

矢车菊二十七号 1668

PCL 点云按强度渲染颜色【2025最新版】

点云按反射强度渲染颜色,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 2万+

【c/c++】内存对齐

首先我们要知道什么是内存对齐?答:内存对齐(MemoryAlignment)是计算机科学中的一个概念,指的是将数据存储在特定的内存地址上,以提高系统性能,是计算机存储数据的一种规则。内存对齐是由编译器、硬件、操作系统以及编程语言的特性共同实现的。编译器负责生成对齐的数据结构和代码,硬件提供对齐访问的性能优势,操作系统管理内存分配时考虑对齐要求,而编程语言提供控制对齐的工具和指令。这些共同作用确保程序在执行时具有高效的内存访问和最佳的性能。

2301_80774875的博客 1396

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C/C++中的内存对齐详解

C/C++内存对齐:深度解析与应用

m0_71974552的博客 2540

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++ Learning 内存对齐

简要介绍C++中的内存对齐

2301_79744389的博客 1007

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++内存池的内存对齐问题

摘要 内存对齐是硬件要求、软件正确性和性能优化的三重刚需。内存池必须实现严格对齐,否则会导致性能暴跌、内存碎片甚至程序崩溃。C++内存池主要采用两种对齐方式:手动位运算(极致性能)和C++11标准关键字(优雅安全)。生产级内存池的SizeClass策略遵循「分级对齐+2的幂次取整」原则,小内存精细对齐(8/16字节),大内存粗粒度对齐(64/128字节),在内存利用率和管理效率间取得平衡。这种设计被tcmalloc/jemalloc等工业级内存池广泛采用,是保证高性能和稳定性的核心机制。

m0_62807361的博客 882

[C++] 内存对齐完整解读

说明:内存对齐是指按照特定的规则来组织数据在内存中的排列方式,以提高内存访问的效率。在计算机系统中,内存对齐可以减少CPU访问内存时所需的总周期数,因为许多硬件平台只能从某些特定地址(如2的幂次方)开始读取数据。内存对齐是确保数据的地址是其大小的倍数,这通常可以提高程序的性能,特别是在需要频繁访问数据的情况下。在C++11之前,编译器提供了一些特定的扩展或者特定的编译器指令来实现内存对齐,这些指令通常是编译器特定的。以下是一些在C++11之前常用的内存对齐方法:在MSVC中,可以使用。

wangdsh的博客 2128
上一篇: 手撕排序算法(上)
下一篇: 笔记本如何正确安装对应显卡驱动
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值