结构体内存对齐详解

目录

结构体对齐:

为什么要进行内存对齐?


关于结构体的详解文章:C语言结构体详解_结构体变量和结构体类型举例-CSDN博客

结构体对齐:


存储的时候和当前存储的成员类型字节大小和默认对齐数比较,取小值
存在该对齐数的整数倍位置
即存a的时候,和a的对齐数比;存b的时候和b的对齐数比
而总体的最后的结构体的大小,要看最大对齐数的整数倍
这最大对齐数是结构体内所有变量的对齐数,取最大值和默认对齐数比,取小值
二者要区分开来

为什么要进行内存对齐?


一般来说,进行内存对齐是为了提高效率
那么,问题来了:
是怎么提高效率的?

同时在思考这个问题之前,先思考一个问题:
如果不进行内存对齐,会怎么样?又或者说,效率是怎么样的低?低在哪里?
我们对不内存对齐进行分析一下:
假设两个变量:char i  和  int a


很明显,如果不进行内存,就是5个字节
那么,问题来了,怎么访问?
首先,我们要明确一个问题:
那就是计算机是怎么访问数据的?
注意,计算机访问数据只能访问4/8个字节
为什么?
因为硬件的问题
计算机只有32根线或者64根线
每一根线代表一个电信号,要么1,要么0
32根线就是32位,4个字节;64根线就是64位,8个字节
那,为什么只能访问4个或者8个呢?
多了不行,难道少了不行吗?
我访问3个行不行?2个行不行?1个行不行?
可以,没问题。
但是,一次最低消耗要么是32位(4字节),要么是64位(8字节)( 我总不能减掉几根线吧?)
既然最低消耗是那么多,总不能浪费吧?
例如,你只想喝一口水,要扔一个桶到井里打水,你不会真的只打一口水吧?
那么大个桶,别浪费啊,利用到底啊,直接打一桶岂不更好?
所以规定访问的时候,要么4字节要么8字节
所以,如果不进行内存对齐:(如果是32位机器)


访问第一个char,一个字节,只需要访问一次
访问第二个元素int,四个字节,但是注意,只能从0-3访问四个字节,或者从4位置开始往后访问4-7四个字节
此时,访问第二个int类型的数据,就需要访问两次:
为什么?
第一次访问,int只拿到了前3个字节
还少一个字节,需要访问第二次:拿到int的后1个字节
再将两个部分拼凑在一起,组成完整的int数据
别的不说,光是这个步骤,就感觉贼蛋疼,很不爽、不干脆,非常难受
难受就意味着不简单,不简单就意味着复杂,复杂就意味着成本高

所以,不进行内存对齐,访问效率就很低
底在哪里?低在硬件处理的局限性

而如果进行了内存对齐
第一个数据char占据4个字节,第二个数据int占4个字节
都只需要访问一次,效率更快,没有多余的处理

指定对齐数:#pragam back(对齐数)
 

    

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

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

相关文章

大语言模型的“大”体现在哪里

大语言模型中的"大"通常体现在以下几个方面,参数数量,训练数据和计算资源: 参数数量: 大语言模型的一个显著特征是其庞大的参数数量。参数的数量决定了模型的复杂度和表示能力。更多的参数通常意味着模型可以捕捉更复…

【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点

文章目录 题目思路解答 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…

linux系统---selinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体(Subject) 2.2对象(Object) 2.3政策和规则(Policy & Rule) …

手写简易操作系统(三)--加载Loader

前情提要 上一节我们讲了如何启动计算机,这一节我们讲如何加载内核,内核是存在于硬盘上的一段程序,要加载这段程序,那么必然需要从硬盘上读取数据,这里我们就需要使用 ATA PIO 模式 根据ATA规范,所有符合A…

算法---双指针练习-4(盛水最多的容器)

题目 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:盛水最多的容器 2. 讲解算法原理 算法的主要思路是使用双指针的方法,通过不断调整指针的位置来计算面积,并更新最大面积。具体步骤如下: 初始化左指针x为数组…

UE5.1_使用技巧(常更)

UE5.1_使用技巧(常更) 1. 清除所有断点 运行时忘记蓝图中的断点可能会出现运行错误的可能,务必运行是排除一切断点,逐个排查也是办法,但是在事件函数多的情况下会很复杂且慢节奏,学会一次性清除所有很有必…

第五十四回 高太尉大兴三路兵 呼延灼摆布连环马-AI通过构建并训练CNN网络来进行飞机识别

呼延灼举荐了百胜将韩滔和天目将彭玘做先锋。 两军对战,韩滔和秦明斗二十回合,呼延灼与林冲斗在一起,花荣与彭玘斗在一处,后彭玘与一丈青扈三娘斗在一起,被扈三娘抓住。 尽管梁山占优,宋江也没有乘胜追击&…

PyTorch之完整的神经网络模型训练

简单的示例: 在PyTorch中,可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码: import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…

推理判断-聂佳-判读4-定义判断

知识点讲解 考点1 快速识别有效信息 考点2 同构选项排除 题目 考点1 快速识别有效信息 考点2 同构选项排除 总结

P4551 最长异或路径

最长异或路径 题目描述 给定一棵 n n n 个点的带权树,结点下标从 1 1 1 开始到 n n n。寻找树中找两个结点,求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n n n,表示点数…

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1)TI IWR 6843 ISK 1块 2)Micro USB 数据线 1条 1.2 系统环境 1)VMware Workstation 15 Player 虚拟机 2)Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统,可通过如下指令进行…

HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写

好 上文 HarmonyOS 数据持久化 关系型数据库之 初始化操作 我们讲了 关系型数据库初始化 那么 本文 我们来编写 增删改 相关代码 打开我们的项目 打开到 我们之前写的这个 relationalClass 类 然后 我们在 initTaskDB 下面再定义一个函数 叫 addTask 的函数 用来执行添加逻辑 …