C++中的结构体内存对齐规则及原因

一、结构体内存对齐规则

1.第一个成员在结构体偏移量为0的地址处

2.其他成员变量要对齐到对齐数的整数倍地址处(对齐数= min(对齐数,变量大小))

(VS下默认对齐数为8,也可以自定义对齐数,#pragma pack(x),x为对齐数)

3.结构体总大小为:最大对齐数的整数倍(最大对齐数是所有变量类型最大者与对齐数的较小值)

4.对于嵌套结构体,需要对齐到自己最大对齐数的整数倍处。结构体的整体大小就是所有最大对齐数(包括嵌套结构体的对齐数)的整数倍

样例1

class A {int a;char b;
};

sizeof(A)=8

变量a在偏移量为0的地址处,占用前4个地址,对齐数为4(遵循规则1);变量b大小为1字节,VS默认对齐数为8,所以变量b的对齐数为1,可以存放到第4个地址处(遵循规则2);结构体的总体大小需要是最大对齐数的整数倍,变量a的对齐数为4,变量b的对齐数为1,最大对齐数为4,因此结构体的总体大小需要是4的整数倍,而当前结构体只占用了5个字节,所以还需要补3个字节给结构体(遵循规则3);因此结构体的最终大小为8。

样例2

class B {char a;int b;
};

sizeof(B)=8

变量a在偏移量为0的地址处,占用第0个地址,对齐数为1(遵循规则1);变量b大小为4个字节,VS默认对齐数为8,所以变量b的对齐数为4,不能直接存放到第1个地址处,需要补3个字节在变量a后,再将变量b存放到第4个地址处(遵循规则2);最终结构体共占用8个字节,最大对齐数为4,所以无需再补字节给结构体(遵循规则3);因此结构体最终大小为8。

二、为什么要进行结构体内存补齐?

原因1:不同硬件平台规定CPU一次读取字节数不同,可能一次读取2、4、8、16、32个字节

原因2:CPU只能从其读取字节数的整数倍地址处开始读

以CPU一次读取4字节为例,CPU只能从4的整数倍地址处开始读。对于class B,如果没有内存对齐,想要读取变量b的数据,CPU先从0地址处读取4个字节,只能读取到变量b的前3个字节,CPU再从4地址处读取4个字节,才能读取到变量b的第4个字节,需要读取两次,效率低下。

而经过内存对齐后,CPU只需要从4地址处读取一次,即可得到变量b的全部字节。

三、补充:自定义对齐数

#pragma pack(x)      x为对齐数

#pragma pack(1)//将对齐数设置为1
class A {int a;char b;
};class B {char a;int b;
};int main()
{cout << sizeof(A) << endl;//5cout << sizeof(B) << endl;//5return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【笔记】CSDN文本编辑操作(持续更新中......)

文章目录 1、修改字体颜色和字号2、首行悬进两个字符3、图片居中4、字体、文字颜色、居中5、高亮6、重点标注7、加粗 1、修改字体颜色和字号 <html><head><meta http-equiv"Content" content"text/html;charsetutf-8" /><title>修…

互联网医院开发:未来医疗的新篇章

随着科技的飞速发展&#xff0c;互联网已经深入到我们生活的方方面面&#xff0c;而医疗领域也不例外。近年来&#xff0c;互联网医院的发展已经成为医疗行业的新趋势&#xff0c;为患者提供了更为便捷、高效的医疗服务。本文将探讨互联网医院开发的重要性、技术实现以及未来发…

pnpm、npm、yarn 包管理工具

1、npm 关键词&#xff1a;软件包管理器、命令行工具、一个社区和一个平台 npm&#xff08;Node Package Manager&#xff09;是一个用于Node.js环境的软件包管理器。它是一个命令行工具&#xff0c;用于安装、升级、删除和管理JavaScript软件包。npm最初是随同Node.js一起发布…

【30秒看懂大数据】变量

简单说 变量是指研究或观察中可能发生变化的事物、属性或特征&#xff0c;它们可以用来描述数据或现象的不同方面。 举例理解 一位热衷于烹饪的大厨老李&#xff0c;经常尝试不同的菜肴来满足不同顾客的口味。 1. 老李明白&#xff0c;每种食材都等同于一个重要的变量…

【报错记录】mybatis映射对应的类没有无参构造引发的问题

写了一个联表查询文件记录及文件标签的SQL&#xff1a; <select id"selectDataFileVoList" resultMap"dataFileVo">SELECTdf.id AS id,df.file_name,df.file_url,df.file_size,df.extend_name,df.category_name,df.file_extracts,df.create_time,df…

王道_数据结构 1.2_2_算法的时间复杂度

1.2_2_算法的时间复杂度 一、为什么要事先预估算法时间开销二、时间复杂度的计算与技巧1、化简“算法时间开销”的计算方式的依据2、常用技巧&#xff08;1&#xff09;加法、乘法规则&#xff08;2&#xff09;时间复杂度的数量级阶数排行 3、计算时间复杂度的结论与步骤&…

TMC电池供电方案推荐

静音、小巧、精确、高效的构建模块改变了电机在电池供电设备中的使用方式。从恒温散热器阀&#xff0c;到现实捕捉设备和电动工具&#xff0c;再到医疗健康应用&#xff0c;激发丰沛想象力&#xff0c;将可靠概念运用于电池供电设备&#xff0c;为消费者和专业人士带来便利。 …

Klocwork 2023.4发布:问题匹配算法升级,编码标准全面支持!

Klocwork 2023.4 的新增功能 Klocwork 2023.4 改进了问题匹配的算法&#xff0c;为桌面端和CI集成构建之间的结果提供了更大的一致性&#xff0c;以及连续构建之间的问题匹配。Klocwork的最新版本还改进了C/C语言的分析引擎&#xff0c;减少了误报/漏报&#xff0c;跨过程跟踪…

C#,洛布数(Lobb Number)的计算方法与源代码

1 洛布数&#xff08;Lobb Number&#xff09; 在组合数学中&#xff0c;洛布数&#xff08;Lobb Number&#xff09;L(m&#xff0c;n)计算nm开括号的排列方式&#xff0c;以形成一个有效的平衡括号序列的开始。 Lobb数由两个非负整数m和n参数化&#xff0c;其中n>m>0。…

如何本地部署hMailServer邮件服务并实现远程发送邮件【内网穿透】

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

与 gpio相关的OF函数

一. 简介 前面在设备树文件中&#xff0c;创建了 Led设备节点。如下所示&#xff1a; gpioled{compatible "alientek, gpioled";pinctrl-names "default";pinctrl-0 <&pinctrl_gpioled>;led-gpio <&gpio1 3 GPIO_ACTIVE_LOW>;st…

判断当前设备是不是安卓或者IOS?

代码(重要点): 当前文件要是 xxx.js文件,就需要写好代码后调用才会执行: // 判断是不是安卓 const isAndroid () > {return /android/.test(navigator.userAgent.toLowerCase()); }// 判断是不是ios const isIOS () > {return /iphone|ipad|ipod/.test(navigator.use…

《Pandas 简易速速上手小册》第1章:Pandas入门(2024 最新版)

文章目录 1.1 Pandas 简介1.1.1 基础知识1.1.2 案例&#xff1a;气候变化数据分析1.1.3 拓展案例一&#xff1a;金融市场分析1.1.4 拓展案例二&#xff1a;社交媒体情感分析 1.2 安装和配置 Pandas1.2.1 基础知识1.2.2 案例&#xff1a;个人财务管理1.2.3 拓展案例一&#xff1…

【IMAX6U移植OpenCV】

IMAX6U移植OpenCV V1.3 一 安装通用交叉编译器1.1 下载通用交叉编译器1.2 安装通用交叉编译器1.3 验证通用交叉编译器 二 搭建 OpenCV 3.4.1 的编译环境2.1 下载 OpenCV 3.4.1 源码2.2 配置 OpenCV 环境2.3 编译 OpenCV 源码 三 Qt 项目中加入OpenCV3.1 Qt 项目的 pro 文件Open…

【Spark系列1】DAG中Stage和Task的划分全流程

一、整体流程 每个Aciton操作会创建一个JOB&#xff0c;JOB会提交给DAGScheduler&#xff0c;DAGScheduler根据RDD依赖的关系划分为多个Stage&#xff0c;每个Stage又会创建多个TaskSet&#xff0c;每个TaskSet包含多个Task&#xff0c;这个Task就是每个分区的并行计算的任务。…

数灵通外链工具如何实现回传功能?

在数字营销的世界里&#xff0c;了解用户行为是至关重要的。数灵通提供了一个强大的回传功能&#xff0c;能够让我们在用户完成某个动作后&#xff0c;获取到这个动作的数据反馈。利用这个功能&#xff0c;企业可以更好地了解用户需求和行为&#xff0c;从而优化营销策略&#…

Docker Compose下载

使用插件版本&#xff1a; 进行安装 乌班图的安装方式参考&#xff1a;centos 的安装方式参考&#xff1b; sudo yum update sudo yum install docker-compose-plugin通过检查版本来验证 Docker Compose 是否已正确安装。 docker compose version 预期输出&#xff1a; Dock…

编译LVGL遇到的问题及解决方式

问题1: 编译选项报错, 未识别 -Wshift-negative-value 选项 Building project file: main/src/main.c Building project file: main/src/mouse_cursor_icon.c cc: error: unrecognized command line option ‘-Wshift-negative-value’ cc: error: unrecognized command line …

【目标跟踪】3D点云跟踪

文章目录 一、前言二、代码目录三、代码解读3.1、文件描述3.2、代码框架 四、关联矩阵计算4.1、ComputeLocationDistance4.2、ComputeDirectionDistance4.3、ComputeBboxSizeDistance4.4、ComputePointNumDistance4.5、ComputePointNumDistance4.6、result_distance 五、结果 一…

Node.js 文件系统操作指南

文章目录 Node.js 文件系统操作完全指南一、引言二、基本文件操作2.1 读取文件2.2 写入文件2.3 追加内容到文件 三、文件与目录的创建与删除3.1 创建文件3.2 创建目录3.3 删除文件3.4 删除目录 四、文件与目录的信息查询4.1 检查文件或目录是否存在4.2 获取文件信息4.3 获取目录…