回首遥望-C++内存对齐的思考

这一章节主要巩固一下学习C/C++时内存对齐相关的内容!

文章目录

  • 什么是内存对齐?
  • 为什么要有内存对齐?
  • 如何进行内存对齐?
  • 致谢:

什么是内存对齐?

这里不提及一堆啰嗦概念,就结合实际出发!在开发C++程序时,与内存接触较多,当定义一个结构体时,我们以为他是XX字节,结果不是,请看下图:

在这里插入图片描述

新手刚学习肯定会认为他是6字节,int四个字节,char是1字节,4+1+1=6,但是在VS2022 X64平台默认下,我们看看他是多少字节!

当我们把鼠标悬浮在struct名字上就会自动弹出悬浮框,告诉我们是8Byte!这就是内存对齐从而对结构体大小产生的影响!

在这里插入图片描述

其实内存对齐本质上就是,Visual Stdio平台给结构体留了一些空白的Padding间隙!【注意,有时VS的悬浮框的数值不一定准确,可以sizeof打印观看】

为什么要有内存对齐?

先说结论,两个方面:

  • 1、为了读写效率
  • 2、为了平台兼容性

​ 这里需要对计算机体系有个基本了解,但是不废话,咱们大白话直白平铺。当CPU需要读写内存数据,需要通过地址总线、数据总线的辅助,传递地址数据和获取真正内存数据!不同计算机平台这些所谓的总线宽度是不同的!

​ 假设在大多数32位cpu中,所谓这些总线宽度是32位,也就是4字节长度!也就代表真正一次能够读取的数据最多就是4个字节!

​ 上一段说,既然一次最多读取4个字节数据,那地址的编号,咱们就4个字节依次对地址编号,第1个4个字节内存的地址叫0,第2个4个字节内存的地址叫1,依次递增,如下图:

在这里插入图片描述

既然都已经编号成这样了,那你说他可能会访问所谓的0.5地址编号的内存吗?所以这里有两种取舍:

  • 1、压根不支持这样读写
  • 2、支持,但是需要分两次读写

如果是第一种情况,正好解释了内存对齐原因的第二点:为了平台兼容性!因为只支持4Byte对齐的读写,所以不对齐不行啊,这个理由可否?

咱们来看看第二种情况,咱们假设CPU支持,那么如果要读0.5位置的4Byte数据,CPU怎么办?

其实它还是一样不能直接读取不了0.5位置的数据,但是可以读两次,第一次读0编号,第二次读1编号,最后分别都拿一点数据,然后拼起来!如下图示意:

在这里插入图片描述

我们直观的感受到,既要读多次,又要进行数据拆分和拼接的计算过程,很显然,没有一次性直接读出来来的高效!

这也验证了为什么要内存对齐的第一个方面:为了读写效率!

如何进行内存对齐?

​ 这里结合网上的帖子和自己的实验验证,直接给出内存对齐规则以及相应名词介绍!

前置名词介绍:

  • 默认对齐系数
  • 成员有效对齐值
  • 结构体最大对齐值

什么是默认对齐系数?

​ 它是一个数字,每个特定平台的编译器有自己的默认“对齐系数”,这里以Visual Stdio 2022的测试为例,X86默认对齐系数是8,X64默认值是16。

如何查看的呢?通过VS提供的指令:#pragma pack(show) 可以在编译时,作为warning信息显示出,如下图:

在这里插入图片描述

什么是成员有效对齐值?

​ 它也是一个数字,以结构体来说,结构体每个成员都有自己的有效对齐值,计算公式:有效对齐值 = min{默认对齐系数, 变量类型字节长度}!

举个例子:

在这里插入图片描述

简单易懂,因为int类型,字节长度4,所以有效对齐 = min{4, 16} = 4,16是当前平台的默认对齐系数!

什么是结构体最大对齐值?

​ 它也是一个数字,上一节说了,既然结构体每个成员都有一个有效对齐值,那么最大的那个数字就是结构体最大对齐值!

举个例子:

在这里插入图片描述

前置名词介绍完了,咱们上正菜,内存对齐规则:

简单结构体的内存对齐规则:

1、结构体第一个成员的位置偏移为0!

2、结构体非第一个成员的位置偏移,是该成员有效对齐值的整数倍!【因为此限制,自然会和上一变量位置可能有空白Padding】

3、结构体总大小是结构体最大对齐值的整数倍!【因为此限制,结构体末尾是可能存在空白Padding】

举两个例子,辅助大家理解:

例1:

在这里插入图片描述

根据规则3,结构体最大对齐值为4,而如果仅仅三个变量大小和为6字节,所以尾部补充2字节的空白Padding!

例2:

在这里插入图片描述

应用规则2: 考虑第二个变量int i,因为它的有效对齐值为4字节,所以距离第一个成员留有3字节的空白Padding!

应用规则3: 三个成员+3字节Padding,一共是1 + 3 + 4 + 2 = 10字节,而最大对齐值是4字节,所以尾部补充2字节空白Padding!

上述说的都是不存在结构体复合嵌套的情况,其实嵌套了,规则也是类似,但是有一些需要注明的要求,如下:

嵌套结构体的内存对齐规则补充:

1、结构体第一个成员的位置偏移为0!

2、结构体非第一个成员的位置偏移,是该成员有效对齐值的整数倍!

【如果是结构体类型成员,则该成员的有效对齐值是成员对应结构体类型自身的最大对齐值】

3、结构体总大小是结构体最大对齐值的整数倍!

举两个例子,辅助大家理解:

例1:

在这里插入图片描述

T1不多赘述,重点解释下T2中的b成员,也就是嵌套结构体成员类型!

在计算T2的b成员的有效对齐时,它并不是用T1的结构体大小和默认对齐值16取最小值,而是用该结构体类型的最大对齐值和默认对齐值取最小值,也就是T1的最大对齐值8和16取最小值为8作为b成员的有效对齐值

例2:

在这里插入图片描述

大家好好品味品味吧!

致谢:

​ 今天的学习就到此为止啦,喜欢的小伙伴点点关注+赞哦!有问题及时留言!感谢大家Thanks♪(・ω・)ノ!我是火火,火一般的男人!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从代码到云端:使用PyCharm打包Python项目并部署至服务器的完整指南

从代码到云端:使用PyCharm打包Python项目并部署至服务器的完整指南 引言 随着云计算技术的发展,越来越多的开发者选择将自己的应用部署到云服务器上。对于Python开发人员来说,如何高效地将本地开发完成的应用程序迁移到远程服务器成为了一个…

【ComfyUI +BrushNet+PowerPaint】图像修复(根据题词填充目标)——ComfyUI-BrushNet

运行代码:https://github.com/nullquant/ComfyUI-BrushNet 源码1:https://github.com/TencentARC/BrushNet 源码2:https://github.com/open-mmlab/PowerPaint 上图,中间未 random_mask.safetensors结果,最右边图未segm…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址:https://arxiv.org/abs/2405.14616 源码地址: https://github.com/kwuking/TimeMixer 背景 数据是有连续性,周期性,趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

3196. I’m stuck!-13年12月CCF计算机软件能力认证

关键词 图通路,DFS/BFS 题目 思路 几点想说明的: 为什么要两个DFS;dfs1表示的是求从S出发能到达的所有的点;dfs2是考虑从T出发回溯,能到达的所有点,回溯去走,相当于此时T才是起点check函数&…

若依笔记(九):商城系统apk打包与调试

目录 env修改 nginx修改 apk打包 按照前文所述app版本保持2.2,使用uniapp作为生成工具,因为app版本涉及到登录、商品、支付,微信小程序打包需要企业主权限,所以使用apk打包,使用uniapp自带的云打包,本地…

算法练习记录

dp(完全,线性,树状,状压,数位)> 搜索 基础算法(二分,前缀和,高精度,公约数,公倍数,质数,排序) > 数据结…

深入浅出 ChatGPT 底层原理:Transformer

Transformer 在人工智能和自然语言处理领域,Transformer架构的出现无疑是一个里程碑式的突破。它不仅推动了GPT(Generative Pre-trained Transformer)等大型语言模型的发展,还彻底改变了我们处理和理解自然语言的方式。 GPT与Transformer GPT 近几年,人工智能技…

【C语言】js写一个冒泡顺序

用js写一个冒泡排序 当然可以。在JavaScript中&#xff0c;你可以使用递归的方式来实现冒泡排序算法。这是一个简单的示例&#xff1a; function bubbleSort(arr) { let len arr.length; if(len < 1){ return arr; // 如果数组只有一个元素或为空&#xff0c;直接返回 } //…

Leetcode3345. 最小可整除数位乘积 I

Every day a Leetcode 题目来源&#xff1a;3345. 最小可整除数位乘积 I 解法1&#xff1a;枚举 至多循环 10 次&#xff0c;一定会遇到个位数为 0 的数字&#xff0c;数位乘积是 0&#xff0c;一定是 t 的倍数。 所以暴力枚举即可。 代码&#xff1a; /** lc appleetcod…

element的from表单校验问题 —— 校验内容正确、但触发错误提示

问题&#xff1a;二次封装了el-radio&#xff0c;在选择后触发了form的校验&#xff0c;并提示了错误。 分析&#xff1a;输出radio选择后的value值是正确&#xff0c;但还是触发了错误校验提示&#xff0c;可能纯在以下几个问题 1. v-model 绑定的form参数和rules不一致 2. e…

工业相机选取

1.相机分类&#xff1a; 1.1 在相机曝光方式中&#xff0c;全局曝光和卷帘曝光是两种主流技术。CCD相机通常采用全局曝光方式&#xff0c;而CMOS相机则可能采用卷帘曝光。 面阵相机与全局曝光关联与区别 关联&#xff1a;面阵相机可以使用全局曝光作为曝光方式&#xff0c;但…

使用Windows自带的IIS搭建FTP服务端

1、启用IIS功能 2、打开IIS 3、将默认的站点删除 4、创建FTP服务端 &#xff08;1&#xff09;选中站点&#xff0c;然后点击鼠标邮件&#xff0c;点击添加FTP站点 &#xff08;2&#xff09;指定站点名称和物理路径 物理路径&#xff1a;FTP服务端数据的路径&#xff0c;F…

研界的福尔摩斯——扩增子+qPCR

微生物在生物地球化学循环、动植物健康等多种领域发挥作用&#xff0c;因此&#xff0c;精确测量微生物绝对丰度对理解其与人类健康、植物生长等的关系至关重要。 常规扩增子测序分析只能解析样本中的物种组成和其相对丰度信息&#xff0c;并不能反映样本每种微生物的真实数量…

期权懂|期权到期了,可以不行权吗?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权到期了&#xff0c;可以不行权吗&#xff1f; 期权到期后&#xff0c;投资者并非必须行权。如果行权无利可图或不符合预期收益&#xff0c;可以选择放弃行权&#xff0c;让期…

SL1571B 输入5V2A或单节锂电池,升压12V 10W 升压恒压芯片

一、概述 SL1571B是一款高功率密度的异步升压转换器&#xff0c;专为便携式系统提供高效且小尺寸的解决方案。它内置MOS管&#xff0c;具有120mΩ功率开关&#xff0c;支持宽输入电压范围&#xff0c;并具备多种保护功能。 二、主要特性 输入电压范围&#xff1a;SL1571B的输…

接口测试vs功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 创建环境 conda create -n lod-3dgs python3.71. 安装CUDA11.6和相应cuDNN。 1.1 CUDA CUDA安装参考CUDA1&#xff1b;CUDA11.6&#xff0c;安装过程相似。 1.2 cuDNN 参考&#xff0c;下载对应版本后复制到对应CUDA里面。 cp cuda/lib64/* /usr/local/cuda-11…

IIS安装,Sql Server安装

在Windows操作环境下&#xff0c; 首先检查是否安装IIS&#xff0c;在“管理工具”中查看目录中是否存在Internet Information Services&#xff08;IIS&#xff09;的文件&#xff0c;存在则IIS已经安装成功。未安装则使用以下步骤&#xff1a; 1、使用winR打开控制面板&…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…