c++字节对齐规则

C/C++—— 内存字节对齐规则 内存对齐规则 阅读详情

先看下面这个类

class MyClass //字节对齐的规则:按当前类中元素所占最大字节对齐
{
public:
	char a; //1字节
	int b;	//4字节

	static void hello(){ int i; };
	virtual void hello1() = 0;
	virtual void hello2(); //每个类都有一个虚函数表,由专门的虚函数指针指向该表,指针占4字节

	void hello3(); //普通函数在类中不占字节
	void hello4();

	double c;	//8字节

	float e;	//4字节

	MyClass();
	~MyClass();

private:

};

在main中,我们输出sizeof(MyClass)的结果是32。

至于为什么是32,我们看下面这个图就理解了。

解释:注意最大字节是double类型的8字节,所以以上图表一行占8个格子。

首先a占一个字节。接着是b,但是b是整形,4才是sizeof(int)的倍数,要存放b的话,需要往后偏移3个字节。然后把b存放在偏移量为4的地址上,占4个字节。

因为虚函数指针是4个字节,此时第二行偏移量首地址是8,8是4的倍数,所有p存放在偏移量为8的地址上,占4个字节,依此类推,得到该类占32个字节。

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

相关推荐

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

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

cnmik42448的专栏 430

C++ 中字节对齐总结

C++ 中字节对齐总结

编程猿来如此 985

智能车图像处理去畸变+逆透视教程

图像处理,去畸变与逆透视整合

wu58430的博客 1万+

struct/class等内存字节对齐问题详解

问题引入 定义一个结构体的一般形式为: struct 结构体名 { //类型说明符 成员名; }; 例如有如下结构体: struct Stu { int id; char sex; float hight; }; 那么一个这样的结构体变量占多大内存呢?也就是 cout<<sizeof(Stu)<&lt...

weixin_30412577的博客 1221

三相交错并联的boost变换器simulink仿真,电流双闭环控制策略

文章介绍了一种基于Simulink的三通道交错并联双向Buck-Boost变换器的设计与仿真。该变换器采用电压外环和三电流内环的控制策略,并通过120°载波移相技术实现Buck模式与Boost模式之间的平滑切换,有效避免了过压和过流问题。交错并联的拓扑结构不仅减少了电感电流的纹波,还缩小了每相电感的体积,提升了电路的响应速度,适用于储能系统。仿真过程完全离散化,采用离散解析器,主电路与控制部分以不同步长运行,更贴近实际应用。控制与采样环节均为手工搭建,未使用Matlab自带模块,展示了三相交错并联Boost

2510_91195931的博客 1706

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 461

C++ 字节对齐

如果 0x02~0x05 存了一个 int ,读取这个 int 就需要先读 0x01~0x04,留下 0x02~0x04 的内容,再读 0x05~0x08,留下 0x05 的内容,两部分拼接起来才能得到那个 int 的值,这样读一个 int 就要两次内存访问,效率就低了。划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是。为什么非对齐访问内存慢?

泠山的博客 1628

C++类的大小和字节对齐

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

weixin_44139651的博客 1055

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1998

基于 MFC C++ 的心电监测客户端

4. **报警功能**:使用 `PlaySound` 播放报警音(需准备 `alert.wav` 文件),界面显示报警状态。

寒寒豆豆软件公司的博客 90

C/C++字节对齐规则

字节对齐与具体编译器相关,但一般都遵循以下三条规则: (1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; (2)结构体每个成员相对于结构体首地址的偏移量,都是#pragma pack指定的数值和该成员大小中较小那个的整数倍。如有需要编译器会在成员之间加上填充字节; (3)结构体的总大小为结构体最宽基本类型成员大小与#pragma pack指定的数值中,较小那个的整数倍,如有需要编译器会...

sj_djw的博客 1431

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

C++ 字节对齐规则

C++ 字节对齐规则 规则 遵循结构体对齐(成员大小向各参数中较小的对齐,结构体总长度要是所有对齐参数的整数倍) 空类大小为1:地址唯一,相当于占位符 成员函数中有虚函数(要有一个虚表指针),普通成员函数不占内存 静态成员变量不占内存(存储在全局变量区,类共享) 样例 所有代码都是在VS的编译结果 #include<iostream> #include<algorithm> using namespace std; class a { int i; char c

baidu_36115645的博客 488

【我的Android进阶之旅】异常: Problems reading data from Binary store in Local\Temp\gradlexxx.bin (exist: true)

一、异常描述 今天开个会议,电脑自动关机了,重启电脑之后,打开Android Studio,编译代码,就编译失败,如下所示:异常提示 : Caused by: java.lang.RuntimeException: Problems reading data from Binary store in C:\Users\000\AppData\Local\Temp\gradle6337489649031706149.bin (exist: true) Caused by: java.lang.Runtime

字节卷动 3822

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++内存字节对齐规则

为什么要进行内存对齐以及对齐规则 C/C++—— 内存字节对齐规则 C++内存字节对齐规则 转载于:https://www.cnblogs.com/qinguoyi/p/10294138.html

weixin_33757911的博客 96

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_44567900的博客 256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

先介绍三个概念:自身对齐值、指定对齐值、有效对齐值。 自身对齐值:数据类型自己的对齐值,例如char类型的自身对齐值是1,short类型是2; 指定对齐值:编译器或程序员指定的对齐值,32位的指定对齐值默认是4; 有效对齐值:自身对齐值和指定对齐值中较小的那个。 对齐有两个规则 一、不但结构体的成员有有效对齐值,结构体自己也有对齐值,这主要是考虑结构体的数组,对于结构体或者类,要将其补齐为其有效对齐值的整数倍。结构体的有效对齐值是其最大数据成员的自身对齐值; 二、存放成员的起始地址必须是该成员有

HelloEarth_的博客 2160

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

虽然我现在开发的时候还没有接触到这一部分的知识,但是我面试了两次,都有考到这个问题,所以还是有必要记录一下。    我在网上找了一篇感觉还不错,我就先记下来,一备以后回忆所用。   一、解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则

yongrendijie的专栏 843

字节对齐总结

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

xiaotangxianshengqi的专栏 717

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

c\c++里struct字节对齐规则

  规则一.:每个成员变量在其结构体内的偏移量都是成员变量类型的大小的倍数。   规则二:如果有嵌套结构体,那么内嵌结构体的第一个成员变量在外结构体中的偏移量,是内嵌结构体中那个数据类型大小最大的成员变量的倍数。   规则三: 整个结构体的大小要是这个结构体内数据类型大小最大的成员变量的倍数。如果有内嵌结构体,那么取内嵌结构体中数据类型大小最大的成员变量作为计算外结构体整体大小的依...

weixin_30300225的博客 136

C/C++ struct中字节对齐问题

标题C/C++中struct中字节对其问题 规则1: 结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员放在offset为该数据成员大小的整数倍的地方(比如int在32为机器为4个字节,则每个int变量都是从4的整数倍地址开始存储) 规则2: 如果一个结构体B里面嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(例如struct B里面有struct A, struct A里面有char, int, double等成员,那

qq_27198345的博客 748
上一篇: shell脚本
下一篇: 进程的基本概念和几种通信方式
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值