C++类字节对齐

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在c语言中,结构体有字节对齐,c++中的类也有字节对齐。在c++里的字节对齐和struct里类似下面我们看看字节对齐的规则和许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4的倍数,这就是所谓的字节对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽松)。下面来讨论4种不同类型的

对齐模数:

内置类型的自身对齐模数(有符号无符号相同)
char 1
short 2
int 4
float 4
double 8

自定义类型的自身对齐模数(struct 、class)
等同于其成员中最大的自身对齐模数 指定对齐模数
我们给编译器指定的对齐模数(在VC中使用指令:#pragma pack(n),如果不指定,在VS2010默认为8)
有效对齐模数 指定对齐模数与类型自身对齐模数的较小的值,就是实际生效的对齐模数。

字节对齐三规则:

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

在C++类里在没有任何数据类型变量的时候,会有一个字节的空间占用,如果有数据类型变量就会有字节对齐,例如:
这里写图片描述
输出为八个字节,首相类开始占空间大小是数据类型最大类型四个字节,下面是数据类型来说,int类型是四个字节,是char类型的整数倍,二者一加是五个字节,五个字节不是刚开始类占用空间四个字节的整数倍,这里就需要对齐,比五大四的最小整数倍是8个字节,其他字节对齐和该例子一样。

还有一种是最容易忽略的就是有虚函数的时候也会占用4个字节的空间,

这里写图片描述
在这里可以看到,当有虚函数的存在时候会占用四个字节的空间,原因是因为如果有虚函数存在在构造对象的时候会多构造一个虚指针。

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

相关推荐

简明总结:C++ 字节对齐,结构体、联合体和的大小

文章目录一、字节对齐的原因二、字节对齐的规则1. 常见型的对齐方式(默认)2. 使用 `#pragma pack(n)` 自行设定变量的对齐方式三、总结 一、字节对齐的原因 如果不按照适合平台的要求对数据存放进行对齐,则会在存取效率带来损失。 假设某平台每次读取都从偶地址开始。若不对数据的存放进行对齐,则某些数据可能被存放于奇地址开始的地方。 这种情况下,平台就需要2个读周期,并对两次读取的结果...

LonelyPlanet_的博客 924

C/C++中的字节对齐详解

字节对齐是指在结构体或联合体中,数据成员的起始地址相对于该结构体或联合体起始地址的偏移量必须是该成员大小的整数倍。比如,一个char型的变量只需要占用一个字节,而int型的变量通常占用四个字节,在结构体中排列时需要考虑它们的大小和对齐要求。按照数据成员对齐规则,a的对齐值为4,b和c的对齐值为1。因此,由于结构体对齐值为4,b和c会被填充2个字节对齐到4字节,从而使得结构体的大小为8字节。(1)数据成员对齐规则:数据成员的对齐值为其型大小和结构体对齐大小中的较小值。C/C++中的字节对齐详解。

pytorchCode的博客 919

C/C++ 字节对齐占用空间

基本数据型长度 目前系统以64位居多,下面列出64位系统下的基本数据型长度。 嵌入式开发或者其他对数据长度敏感的场景,建议使用int8_t / int16_t / int32_t等明确长度的型。 数据型 长度/字节 char 1 short 2 int 4 long 8 long long 8 float 4 double 8 (32位系统为4) void* 8 bool 1 结构体/ 字节对齐 为了CPU高效访问数据,操作系统会对结构体/等非

彼此当年少,莫负好时光 965

了解C++的大小和变量的字节对齐

; 空没有内容,但是需要分配地址;大小为1个字节; 基础; 下图占用8个字节;i 是四字节;c本身是一字节大;为对齐填充了3个字节;总大小是8字节; double为8字节大;下图,4 + 4 + 8 = 16; 带虚函数的情况; 下图占用12个字节, 四字节对齐2个变量共占用8个字节;由于存在虚函数,在开始位置插入了一个虚函数指针,该指针占用4个字节,共计12字节;的非虚函数不占用对象的内存,函数编译后形成二进制文件放在内存中的代码段区; 继承的...

bcbobo21cn的专栏 394

c++字节对齐(全)

一、型字节数 系统平台 16位 32位 64位 char 1 1 1 short 2 2 2 int 2 4 4 unsigned int 2 4 4 float 4 4 4 double 8 8 8 long 4 4 8 unsigned long 4 4 8 long long 8 8 8 * 2 4 8

qq_30534935的博客 2760

c/c++--字节对齐(byte alignment)

的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系跟编译器有关.//用法如下struct bbbchar a;int b;//直接按照实际占用字节来对齐,其实就是相当于按照1个字节对齐了//这里计算sizeof(st3)=5。

qq_37233070的博客 3650

字节对齐

一  什么是字节对齐      现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意型的变量。但实际中在访问特定型变量时经常在特定的内存地址访问,这就需要各种型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。 二  对齐的原因和作用      不同硬件平台对存储空间的处理上存在很大的不同。某些平台对特定型的数据只能从特定地址开始存取,而不允

qq_27652231的博客 688

C++的大小和字节对齐

之前牛客网做C++测试题遇到结构体对齐和大小的问题,没怎么在意,以为就记住了。可是今天看面试问题的时候又看到了,有的地方就想不起来了,所以决定开篇文章记录一下。 大小的问题 1.空 class A { }; sizeof(A); //1 解析:的实例化就是为每个实例在内存中分配一块地址;每个在内存中都有唯一的标识,因此空被实例化时,编译器会隐含地为其添加一个字节,以作区分。 2.虚函数 class A { virtual void Fun(); }; sizeof(A); //4

weixin_44139651的博客 1052

C++中的字节对齐

#include #include using namespace std;class Point{public: int x; int y; char z;};int main(){ Point p; cout << "&p:" << &p << endl; cout << "&p.x:" << &p.x << endl;

Louis的专栏 2128

C++的结构体和是如何进行字节对齐的?

由于,C/C++中结构体和的内存模型基本上是一样的,所以我们这里只讨论是怎么样的。结构体也是采用相统的原则 我们都知道,在中,如果我们用sizeof()去查看它的大小会返回这个的所占的字节大小,但是这个大小并不是直接叠加的。比如我们知道: 一个 int 型占用4字节,一个char型占用一个字节,可是他们两个放在同一个中,他们的大小并不是 4+1=5字节。 而是8字节,这是因为编译器对存放在中的这两个成员变量进行了补齐。 那么补齐的规则是什么?这里废话不多说,直接说结论: C++ 中按照中最

qq_41777514的博客 476

C++进阶之大小、字节对齐问题、虚函数在中所占内存问题

一、结构体在内存中占用的字节数示意图 字节对齐问题:字节对齐是为了提高CPU效率,windows下默认追加4位,根据实际情况而定。 就比如结构体A的字节数,从图中可以看出,存放的最长字节数位double型为8,字节对齐即将及将结构体中每个字节都与最长的字节进行统一对齐,也就是说,char和int,各占8位,所以A结构体占24位。注意:存储时是根据定义的顺序进行顺序存储,就会发现,D结构...

qq_44660367的博客 915

C++字节对齐

暂无

黑子 631

C++中采用位域时为什么不能使用字节对齐

共用体允许你在相同的内存位置存储不同型的数据,这意味着你可以将位域和非位域的数据放在同一个内存区域中。这样,你可以通过位域来操作数据,同时也能直接访问底层的字节数据,从而方便地进行HEX格式的转换和发送。在C++中使用位域(bit-fields)时,不能直接应用字节对齐的原因主要是因为位域的布局和对齐是由编译器控制的,并且与具体的实现相关。这样可以绕过位域的对齐问题。通过这种方式,你可以通过位域来设置数据,然后通过共用体中的原始字节数组来访问这些数据的底层表示,从而方便地进行HEX格式的转换和发送。

eydj2008的专栏 582

C++】继承之sizeof计算_字节对齐【总结篇】

出于网上对struct、union的字节对齐的文章比较多;而讲继承的sizeof计算比较少,而且往往因为作者不够细心出了一些误导人的错误的原因,写了此篇博客,请大家指正。 首先申明继承的sizeof计算与struct的sizeof计算是不一样的。请看: class A{public: int a1; char a2;};class B:public A{public: ...

weixin_33834679的博客 245

对于与结构体的字节对齐以及C++11中关键字alignas,alignof

一.什么是字节对齐? 从理论上讲对任何型的变量的访问可以从任何地址开始,但实际情况是在访问特定型变量的时候经常在特定的内存地址访问,这就需要各种型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 二.为什么要字节对齐? 主要原因是用空间来换取存储效率。访问的话就是似 硬件每次读取地址的位置差。相当于pc = pc+1;每次移动...

qq_40324647的博客 2351

C++基础 -13- 字节对齐

C++基础 -13- 字节对齐

摸鱼专家 478

C++ 字节长度,字节对齐以及对象的长度

字节长度,字节对齐以及对象的长度 structst { shortnum; floatmath_grade; floatChinese_grade; floatsum_grade; }; int_tmain(intargc, _TCHAR* argv[]...

weixin_34279246的博客 249

c/c++结构体和字节对齐详解

什么是字节对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何型的变量的访问可以从任何地址开始,但实际情况是在访问特定型变量的时候经常在特定的内存地址访问,这就需要各种型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 为什么要对齐? l 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设一个整型变量的地址不是自然对齐,比如为0x00

clyang92的专栏 682
上一篇: C++如何直接对对象进行运算操作
下一篇: C++下的new operator、operator new 、placement new和set_new_hander函数讲解
magiclyj
博客等级 码龄10年 41粉丝 76原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值