结构体内存对齐与位段详解

news2024/11/22 23:23:47

文章目录

  • 前言
  • 一、内存对齐
    • 1.内存对齐的规则
    • 2. 内存对齐的具体实例与运用
    • 3.为什么会有内存对齐?
    • 4.修改默认对齐数
  • 二、位段
    • 1.什么是位段
    • 2.位段的例子
    • 3.位段的优缺点
  • 结语


前言

在这里插入图片描述


学习了结构体,你会算结构体的占用字节数吗,许多人恐怕摇头,而算字节大小需要了解内存对齐这个知识点,当然除了内存对齐,位段也是

一、内存对齐

1.内存对齐的规则

我先给两个例子

struct S1
{
	char c1;
	int i;
	char c2;
};
struct S2
{
	char c1;
	char c2;
	int i;
};
int main()
{
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
}

你们猜两个的占用字节数是多少?很多人可能都觉得都是8可是很遗憾
在这里插入图片描述
这里就涉及到内存对齐了

我这里先把内存对齐的规则放上来

  1. 第一个成员在与结构体变量偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的值为8
  3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2. 内存对齐的具体实例与运用

我们按照规则来讲解这两个例子
在这里插入图片描述

在这里插入图片描述
看到这里,是不是对内存对齐清楚很多了

3.为什么会有内存对齐?

  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
    定类型的数据,否则抛出硬件异常。
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
    问。

总的来说就是空间换时间

4.修改默认对齐数

#pragma pack(8)//括号里就是默认对齐数

二、位段

1.什么是位段

1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字,后面的数字是比特位

光概念啥的可能不理解,还得上例子

struct A//注意这些数字申请得1是位
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
}

2.位段的例子

struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;

在这里插入图片描述

在这里插入图片描述

3.位段的优缺点

优点:看到这的人也应该自己能够知道优点了,那当然是节省空间啦,正因为这个原因,发送一个数据需要有以下过程
在这里插入图片描述
缺点:差不多与内存对齐是反的

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
    器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
    舍弃剩余的位还是利用,这是不确定的

结语

谢谢各位看到这里,至此这篇文章就讲完了,相信大家应该能够明白了

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

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

相关文章

ArcGIS分式、假分式标注

解说一下 ArcGIS中不同标注 直接标注语句分享见文后 分式标注 假分式标注 二、标注语句与视频教学 ArcGIS分数、假分数标注获取语句地址: ArcGIS分式、假分式标注!标注语句直接分享 推荐学习 ArcGIS之模型构建器(ModelBuilder&#xff0…

初级通讯录的实现详细攻略

我们设计的要求存储多少个人的信息我们使用宏,这样方便修改建立三个文件先从主函数入手为了持续多次,实现操作,我们利用循环,循环次数未知,我们只能选择while循环,do-while循环,我们始终要进行一…

ORB-SLAM2 --- LoopClosing::Run 回环检测线程解析

目录 1.函数作用 2.code 3.函数解析 3.1 查看是否有待处理的回环关键帧LoopClosing::CheckNewKeyFrames 3.2 检测闭环LoopClosing::DetectLoop 3.3 计算当前关键帧和上一步闭环候选帧的Sim3变换 3.4 闭环矫正 1.函数作用 回环检测,又称闭环检测&#xff0c…

文件操作和IO

一.文件的概念:狭义的文件指:硬盘上的文件和目录广义上的文件指:计算机中的很多软硬件资源路径:绝对路径:以c:d盘符开头的路径,比如c:/Intel/Logs/text.txt相对路径:以当前所在的目录…

Vue - 完美解决小数的四则运算(加减乘除)导致精度丢失问题,提供详细计算示例代码vue数据计算丢失精度

前言 由于 JavaScript 语言的问题,两个小数进行四则运算时,会出现各种问题,一些财务系统是必须要解决的。 本文实现了 完美修复小数计算时,计算错误、精度丢失等问题, 您可以进行任意小数的四则运算,都能保证结果是正确的。 如下图所示,使用了本文提供的方法后,可以形…

ArcGIS修改图斑时替换几何的妙用!不要只会整型要素

我们时常通过整型要素来修改要素的形状,但是有时候我们改变整个要素的形状、位置,还要保留属性不变,那我们就要考虑,高级编辑中的“替换几何”工具了。 01 替换几何原理 1 、“替换几何”工具可以为要素创建全新形状。“替换几何…

【Java】Properties类

文章目录01 初识Properties02 Properties常用方法03 Properties使用案例01 初识Properties 创建这样一个配置文件: 传统方法: public static void main(String[] args) throws IOException {//读取mysql.properties文件,并得到ip、user、pw…

Dubbo集群容错

Dubbo集群容错 1. 集群容错 集群调用失败时,Dubbo 提供的容错方案。 在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。 各节点关系: 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,I…

n皇后(回溯)

著名的n皇后问题 即在棋盘上任意两个皇后不能在同一行,同一列,或者斜对角线,反斜对角线的位置 以判断(5,1)位置为例 往右下方(斜对角线)一连串的位置 (5,1&…

Naive-UI自定义TabPane样式

前言前端开发通常使用 第三方 UI 组件库,像大家熟悉的 Element-UI、AntD Vue 等最近发现一个 还比较好用的 组件库 Naive-UI 传送门 ,Vue 3 组件库,使用 TypeScript ,用起来感觉还不错,它的主题也可以切换 &#xff08…

首款自研成像雷达发布!国产玩家赋能智能驾驶“第四类”感知

4D成像雷达赛道的“战火”正在不断升级。 高工智能汽车研究院预计,4D成像雷达将从2023年初开始小规模前装导入,预计到2024年,定点/搭载量有望突破百万颗,到2025年占全部前向毫米波雷达的比重或超过40%。 伴随着中国自动驾驶的渗…

Java多线程:多线程 Thread 类 中常用的方法的使用

Java多线程:多线程 Thread 类 中常用的方法的使用 每博一文案 日本有一位方丈曾在其寺庙的公告栏上写下一句标语: ”没有失败的人生才最失败。“ 深以为然,不上高山,不知平地,不经大海,不懂宽阔的涵义&…

很少人知道的7个极酷HTML元素

搜索很酷的HTML元素,尤其是当您不知道要查找什么时,通常就像被扔进一堆垃圾中一样动图别担心,我为你做了肮脏的工作!在浏览了看似无穷无尽的HTML元素之后,我挖出了一些很少使用的宝石!1. meter&progres…

多线程Monitor工作原理

🍎1. 什么是Monitor?我们都知道synchronized的作用是用来保证修饰的代码或者方法执行有且只有一个线程执行,也就是锁。那么在执行被锁住的方式时,synchronized就需要通过monitor来记录和保证锁的状态。所以monitor这里的作用其实就是起到了控…

RFID固定资产管理系统实现批量“秒”级盘点

面对成千上万,乃至几十万的固定资产,如何能高效管理,做到管理无漏洞,盘点无错漏呢?很多企业和软件厂商都在考虑这个问题。现如今,随着物联网的发展,企业可批量实现固定资产的秒级盘点&#xff0…

【C++核心编程】C++全栈体系(十一)

C核心编程 第四章 类和对象 七、多态 1. 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数…

打印机共享遇到的常见问题与解决方法

共享打印机提示错误0X000006d9 解决方法: 1、桌面找到计算机或此电脑,然后再图标上右键选择管理选项菜单; 2、在打开的计算机管理对话框中选择服务和应用程序选项; 3、双击服务和应用程序选项就会打开一个对话框,然后再选择服务菜单双击;

01-JDK、JRE、JVM之间的区别?

1.JDK JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运⾏Java程序所需的各种⼯具和资源,包括Java编译器、Java运⾏时环境,以及常⽤的Java类库等. JDK安装目录中真正在运行java时起作用的是 bin、include、lib、…

一网打尽链表的经典OJ题!链表必考笔试题第二弹

目录 0.前言 1.合并两个排序链表 1.1 实用小妙招 1.2代码书写 2.链表分割 3.链表的回文结构 4.相交链表 4.1 实用小妙招(假定指针法) 4.2代码书写 5. 复制带随机指针的链表 0.前言 本文代码及分析图片资源都以上传Gitee,可自取&a…

【Java数据结构】堆与优先级队列(堆)的详解

文章目录 目录 文章目录 一、优先级队列(堆) 1.1优先级队列的概念 二、优先级队列的模拟实现 2.1堆的概念 2.2堆的存储方式 2.3堆的创建 2.4建堆的时间复杂度 2.5堆的插入和删除 三.常用的PriorityQueue介绍 3.1PriorityQueue特性 3.2PriorityQueue常用方法 3.3oj练习 一、优…