C++ 结构体字节对齐规则

C++ 结构体对齐详解 在C++中,结构体(struct)的对齐是指编译器为确保结构体成员在内存中的地址满足特定的对齐要求而进行的调整。对齐有助于提高访问速度,但同时也可能导致内存空间的浪费。默认对齐:通常情况下,最好使用编译器的默认对齐方式,以获得最佳性能。手动对齐:只有在明确知道需要节省内存,并且能接受性能损失的情况下才使用手动对齐。理解和控制结构体的对齐对于编写高效、可靠的C++程序非常重要。希望这篇详解能够帮助你更好地掌握结构体对齐的概念和应用。 阅读详情

先介绍三个概念:自身对齐值、指定对齐值、有效对齐值。

自身对齐值:数据类型自己的对齐值,例如char类型的自身对齐值是1,short类型是2;

指定对齐值:编译器或程序员指定的对齐值,32位的指定对齐值默认是4;

有效对齐值:自身对齐值和指定对齐值中较小的那个。

对齐有两个规则

一、不但结构体的成员有有效对齐值,结构体自己也有对齐值,这主要是考虑结构体的数组,对于结构体或者类,要将其补齐为其有效对齐值的整数倍。结构体的有效对齐值是其最大数据成员的自身对齐值;

二、存放成员的起始地址必须是该成员有效对齐值的整数倍。

typedef struct A {
		char a;
		char b;
		char c;
		char d;
	} structA; 
	typedef struct B {
		char a;
		short b; 
		char c;
		char d;
	} structB; 
	typedef struct C{
		char a;
		int b; 
		char c;
		char d;
	} structC; 
	typedef struct D {
	char a;
	double b; 
	char c;
	char d;
	} structD;

在32位下:

假如结构体起始地址是0x0000

成员a的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0000是1的整数倍,故a存放起始地址是0x0000,占一个字节;

成员b的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0001是1的整数倍,故b存放起始地址是0x0001,占一个字节;

成员c的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0002是1的整数倍,故c存放起始地址是0x0002,占一个字节;

成员d的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0003是1的整数倍,故d存放起始地址是0x0003,占一个字节;

此时结构体A的有效对齐值是其最大数据成员的自身对齐值,它的成员都是char类型,故结构体A的有效对齐值是1。

结构体A的存储结构以下,其中Y是根据规则1补齐的字节,x是规则2补齐的字节。

0x0000

0x00001

0x0002

0x0003

a

b

c

d

根据以上规则能够知道其余结构体的存储结构:

结构体B占6个字节

0x0000

0x00001

0x0002

0x0003

0x0004

0x0005

a

x

b

b

c

d

结构体C占12个字节

成员a的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0000是1的整数倍,故a存放起始地址是0x0000,占一个字节;

成员b的自身对齐值4,指定对齐值4,因此有效对齐值是4,地址0x0004是4的整数倍,故b存放起始地址是0x0004,占四个字节;

成员c的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0008是1的整数倍,故c存放起始地址是0x0008,占一个字节;

成员d的自身对齐值1,指定对齐值4,因此有效对齐值是1,地址0x0009是1的整数倍,故d存放起始地址是0x0009,占一个字节;

结构体C的成员占据10个字节,而结构体C的有效对齐值是其成员b的自身对齐值4,10不是4的倍数,故还需补齐两个字节,此时结构体C占据12个字节,是4的倍数

以下:

0x0000

0x00001

0x0002

0x0003

0x0004

0x0005

0x0006

0x0007

0x0008

0x0009

0x000A

0x000B

a

x

x

x

b

b

b

b

c

d

Y

Y

结构体D占16个字节

0x0000

0x00001

0x0002

0x0003

0x0004

0x0005

0x0006

0x0007

0x0008

0x0009

0x000A

0x000B

0x000C

0x000D

0x000E

0x000F

a

x

x

x

b

b

b

b

b

b

b

b

c

d

Y

Y

代码验证以下:

 

C语言基础 - 结构体类型字节对齐总结 一、什么是字节对齐 在计算机中,内存空间是按照字节(1B = 8 bit)划分的,每一个字节都有一个编号,这就是字节的地址。理论上可以从任意起始地址访问任意数据类型的变量,但在实际使用中,访问特定数据类型变量时需要在特定的内存起始地址进行访问,这就需要各种数据类型按照一定的规则在空间上进行排列,而不是顺序地一个接一个地存放,这就是字节对齐。 如果一个变量的内存起始地址正好是其数据类型长度的整数倍,就被称作自然对齐。比如,在32系统下,假设一个int型变量的起始地址为0x00000004,那它就是自然对齐 阅读详情

相关推荐

C/C++ 字节对齐

字节对齐 结构体的字节对齐是我很早就想全面了解一下的东西,这个东西本质上是和硬件相关的,本来要想真正全面了解的话必须得知道CPU的结构、内存的结构、CPU指令是如何执行的等这些硬件层的东西才行,并不是说了解几个寄存器写两句汇编码就可以的,和这个没联系。在尝试了几次之后,迫于个人能力问题,无奈之下只好放弃深层次的了解,只能了解一下字节对齐的规则,至于为什么要对齐的话题,大概也就只能从网络上那几句肤

chengonghao的博客 1万+

结构体字节对齐详解【含实例】

##一、前言 结构体字节对齐属于老生常谈的问题,看似简单,但却很容易忘记。而且因为结构体使用的普遍性,使得字节对齐也成为了一个不得不谈的话题。之前在C语言作业中有相应的题目,总结了一番,写下了这篇博客。最近抽出时间完善一番,便于以后查阅。 ##二、什么是结构体字节对齐 假设现在有一个结构体如下,问你它的一个对象占用几个字节? struct A{ int a; char b; short c; }; 我们知道这三个变量所占字节数分别为4,1,2,那么应该占用7个字节

x2528238270的博客 2万+

C++ 结构体字节对齐

1.字节对齐的作用 加快CPU访问内存速度,平台移植 2.如何计算字节对齐后的结构体大小 输入下面代码: #include struct stTest { int a; char b; short c; }; int main() { printf( "%u\n", sizeof( stTest ) ); return 0; } 输出结果为8. 字节对齐有

F_r_e_e_x的专栏 1246

结构体字节对齐

如果一个结构体B里嵌套另一个结构体A,还是以最大成员类型的字节对齐,但是结构体A存储起点为A内部最大成员整数倍的地方。),结构体A中的成员的对齐规则仍满足自身的规则。目前未补齐前结构体占10个字节(c1:1,保留3,c2:4,c3:2),不是4的整数倍,因此补齐两个字节,12为4的整数倍。c3:有效对齐值为2,因此排列在2的整数倍地址上,0x0002被占用,0x0004被占用,0x0006被占用,0x0008未占用可用。c2:有效对齐值为4,因此排列在4的整数倍地址上,0x0004未被占用可用。

ljl113的博客 3726

【C++实战篇】结构体字节对齐

该文章主要探讨了结构体在内存中的对齐规则及其对内存占用的影响。实验表明,结构体成员变量的排列顺序会直接影响其内存大小,遵循从小到大或从大到小的顺序排列最为节省空间。编译器默认采用8字节对齐方式,但可通过#pragma pack指令修改对齐字节数(1/4/8字节)。特别在内存受限的嵌入式系统中,合理设置对齐方式尤为重要。文章还分析了嵌套结构体的对齐规则,指出嵌套结构体的起始地址需满足其内部最大成员的对齐要求,并通过多个结构体实例验证了理论分析。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1351

usb设备的定位信息获取

一个usb hub有20个口,每个口有一个标号,那么如果一个为X的标号插入了一个android设备,如何通过函数,得到这个X,代码实现如下,获取了location, 得到类似 Port_#0002.Hub_#0003 的字符串,然后,要对应一个表。

babytiger的专栏 2106

C++学习笔记基础篇21——结构体和类的字节对齐规则

为什么要进行字节对齐? 《Windows核心编程》里这样说:当CPU访问正确对齐的数据时,它的运行效率最高,当数据大小的数据模数的内存地址是0时,数据是对齐的。例如:WORD值应该是总是从被2除尽的地址开始,而DWORD值应该总是从被4除尽的地址开始,数据对齐不是内存结构的一部分,而是CPU结构的一部分。当CPU试图读取的数值没有正确的对齐时,CPU可以执行两种操作之一:产生一个异常条件;执行多次对齐的内存访问,以便读取完整的未对齐数据,若多次执行内存访问,应用程序的运行速度就会慢。 字节对齐实验理解 定义

weixin_44567900的博客 256

具身机器人内部PCB板分类与系统架构详解

本文系统梳理了机器人内部PCB板的功能架构,将其划分为5大模块:1)核心主板(含主控计算机板、实时控制板等);2)感知类PCB(视觉、听觉、触觉等);3)运动控制类PCB(伺服驱动、编码器等);4)电源与安全类PCB(电源管理、BMS等);5)通信类PCB(EtherCAT背板等)。通过人体器官类比(如大脑对应主控板、小脑对应实时控制板),详解了各模块的芯片选型、位置分布及协同关系,并给出信号/能量/指令的三流闭环示意图和典型系统参数(48V供电、1ms通信周期)。整体呈现了机器人"神经系统&qu

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 324

C++结构体字节对齐规则

自身对齐值:数据类型本身的对齐值,即数据类似所占的字节数(char为1,short为2,int为4,long为8,double为8,float为4)。 指定对齐值:一般32位机器的指定对齐值为4。 有效对齐值:自身对齐值和指定对齐值中比较小的一个。 结构体对齐规则 对于结构体和类,要将其补齐为其有效对齐值的整数倍。 结构体中存放的成员的起始地址必须是其本身有效对齐值的倍数。 结构体也有对齐值,结构体的有效对齐值是其最大数据成员的自身对齐值。 https://www.cnblogs.com/heart.

qq_41084735的博客 417

多摄像头同步技术:帧同步信号在Sensor与解串器间的传递机制

本文深入探讨了多摄像头系统中帧同步信号的两种核心传递机制:由解串器统一发号施令或由主Sensor作为“带头大哥”。文章对比了两种方案在同步精度、硬件复杂度、成本及适用场景上的差异,并提供了实战配置要点与调试心法,为车载环视、ADAS及工业检测等应用提供关键的技术选型与实施指导。

weixin_29193359的博客 435

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

C/C++ 结构体字节对齐 3 大规则详解:从 5 个实例到内存布局可视化

本文深入解析C/C++结构体字节对齐的三大核心规则,通过5个典型实例详细展示内存布局的计算方法。从基础类型混合到复杂嵌套结构体,结合可视化技巧和性能优化建议,帮助开发者掌握字节对齐原理,提升代码效率与跨平台兼容性。特别强调结构体成员排序优化和缓存行对齐等高级技巧。

cnmik42448的专栏 430

Cilium动手实验室: 精通之旅---1.Getting Started with Cilium

我们需要在 HTTP 层的第 7 层实施策略,以限制允许 tiefighter 调用的确切 API,以及不允许调用哪些 API。上仅需要的 API 资源的访问,从而为微服务之间的通信实施“最低权限”安全方法。船只上进行匹配,因此我们需要在该标签上进行匹配,此外,我们必须确保来自带有标签。为了模拟我们的连接测试,我们将使用 curl 执行简单的 API 调用。在我们立即开始更改策略之前,让我们考虑一下相应的网络策略应该是什么样子。的规则,该规则将通过 L3-L4 策略对死星的访问限制为仅帝国船只。

Q先生 1126

c/c++ 结构体字节对齐规则

/ [b1][b2] offset=1, short数据默认的对齐参数为2,因此offset需要调整为2的整数倍,即offset调为2, 在前面数成员aa末尾填充一个字节。// [f1][f2][f3][f4] offset=17, float数据默认的对齐参数为4,offset调到20,所以在前面的数据成员e末尾填充3字节。// [d1][d2][d3][d4][d5][d6][d7][d8] offset=8, double数据对齐参数为8,不需要调整。struct D d;

yuanshenqiang的博客 693

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 749

Allegro172版本如何在联机模式下使用skill文件操作指导

注意:如果下次重新开启Symphony模式的时候可能导致symphony_skill中的文件内容被清空,所以最好将自己常用的skill文件都写到symphony_skill.txt中去,然后做好备份,需要的时候,在开启软件后把文件放到env目录中去。在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图。这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件。如下图,当调用skill的时候就会出现如下报错。

weixin_54787054的博客 1586

字节对齐总结

结构体(联合)字节对齐规则: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的“对齐系数”。 规则: (一)成员字节对齐 1、普通数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个

xiaotangxianshengqi的专栏 717

【Python搞定车载自动化测试】——Python实现车载以太网DoIP刷写(含Python源码)

随着智能电动汽车行业的发展,汽车=智能终端+四个轮子,而人工智能也发展越来越快,Python语言使用越来越广,本章节主要介绍如何使用Python语言基于Pytest自动化框架来实现DoIP诊断自动化测试。首先回顾一下DoIP诊断基础知识:DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。

测试领域技术分享 3795

C++ 内存的字节对齐

一、字节对齐的原因            在访问内存时,如果地址是按4字节对齐,则访问效率会高很多。这种现象的原因在于访问内存的硬件电路。一般情况下,地址总线总是按照对齐后的地址来访问。例如,你想得到0x00000001开始的四字节内容,系统首先需要以0x00000000读四字节,从中取得3字节,然后再用0x00000004作为开始地址,获得下一个4字节,再从中得到第一个字节,再次组合出需要得到

u011974126的专栏 1302

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

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

c++ 结构体地址 转换成ulong_零基础入门之结构体字节对齐

  一、字节对齐的规则:  1、一般设置的对齐方式为1,2,4字节对齐方式。结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0;这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的。这在网络...

weixin_39733805的博客 148

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C/C++ 结构体、类的内存对齐规则,以及#pragma pack、alignas、alignof的用法。

接下来在64位系统中、编译器默认的对齐字节。

weixin_44078346的博客 1826

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++字节对齐

这篇博客主要介绍C++字节对齐的方式什么是字节对齐现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。为什么要字节对齐各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某...

forDreamYue的博客 1903

结构体的对齐规则及举例

结构体对齐规则及举例结构体概念结构体声明结构体对齐规则C++中的结构体struct---类 结构体概念 一种数据结构; C语言中聚合数据类型的一类; 可以被声明为变量、数组、指针等,用以实现比较复杂的数据结构; 是一系列元素的集合,这些元素被称为结构体成员; 结构体成员需要用结构体名访问。 结构体声明 struct A{ //struct是关键字, A是结构体标志 int a; //a,b是结构体成员列表 char b; }s1; //s1是结构体变量 注意事项: 一般

weixin_45905650的博客 3743

C&C++结构的字节对齐

C&C++结构的字节对齐 测试系统:Windows XP 编译器:VC6.0,VS2008 结构体的字节对齐是我很早就想全面了解一下的东西,这个东西本质上是和硬件相关的,本来要想真正全面了解的话必须得知道CPU的结构、内存的结构、CPU指令是如何执行的等这些硬件层的东西才行,并不是说了解几个寄存器写两句汇编码就可以的,和这个没联系。在尝试了几次之后,迫于个人能力问题,...

weixin_30263073的博客 105
上一篇: vs2017 建立本地Git仓
下一篇: OSG 球体参数方程绘制
HelloEarth_
博客等级 码龄9年 38粉丝 49原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值