结构体介绍(2)

结构体介绍(2)

  • 前言
  • 一、结构体的内存对齐之深入理解
    • 为什么存在内存对齐?
    • 修改默认对齐数
  • 二、结构体传参
    • 2.1:该怎么传参呢?
  • 三、结构体实现位段
    • 3.1什么是位段
    • 位段的内存分配
    • 位段的跨平台问题
  • 总结


前言

根据之前讲了结构体的《声明》、《创建》、《初始化》、《结构体内存对齐》。 接下来我们就来深入探讨结构体


问题:那么有没有考虑结构体嵌套结构体的内存对齐呢?

一、结构体的内存对齐之深入理解

示例:

struct S3
{
	double d;
	char c;
	int i;
};
struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
int mian()
{
	struct S4 s4 = { 0 };
	printf("%zd\n", sizeof(s4));
	return 0;
}

根据规则4:如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员最大对齐数的整数辈出,结构体的整体大小就是所有最大对齐数(包含嵌套结构体中成员对齐数)的整数倍。
那么根据以上代码:
s3就对应其中成员最大对齐数为double类型(8)
再根据规则1、2、3就可以得出这个结构体的大小
在这里插入图片描述

为什么存在内存对齐?

在这里插入图片描述

修改默认对齐数

#pragma 这个预处理指令,可以改变编译器的默认对齐数。

#pragma pack(1)//把默认对齐数定义为1
struct S
{
	char c;
	int i;
	char a;
};
int main()
{
	printf("%zd\n", sizeof(struct S));
	return 0;
}

在这里插入图片描述

二、结构体传参

2.1:该怎么传参呢?

代码如下(示例):

struct S
{
	int arr[1000];
	int n;
	double b;
};
void print1(struct S tmp)
{
	int i = 0;
	for (i = 0;i < 5;i++)
	{
		printf("%d", tmp.arr[i]);
	}
	printf("%d\n", tmp.n);
	printf("%lf\n", tmp.b);
}
int main()
{
	struct S s = { {1,2,3,4,5},100,3.14 };
	print1(s);//这里s里面的数组arr[1000](空间大),但是传参过去时会有空间的浪费
	return 0;
}

这里s里面的数组arr1000,但是传参过去时会有空间的浪费,那么我们用地址来传
同时我们也可以达到同样的效果

修正:
struct S
{
int arr[1000];
int n;
double b;
};
void print1(struct S* tmp)
{
int i = 0;
for (i = 0;i < 5;i++)
{
printf(“%d”, tmp->arr[i]);
}
printf(“%d\n”, tmp->n);
printf(“%lf\n”, tmp->b);
}
int main()
{
struct S s = { {1,2,3,4,5},100,3.14 };
print1(&s);
return 0;
}
在这里插入图片描述

三、结构体实现位段

3.1什么是位段

在这里插入图片描述
比如:
struct S
{
int_a:2;//位段结构、4个字节----32个bit
int_b:5;//位段结构、4个字节----32个bit
int_c:10;//位段结构、4个字节----32个bit
int_d:30;//位段结构、4个字节----32个bit
};
int main()
{
return 0;
}

首先: 位段中的位是二进制位
那么0就可以用2个bit来表达00
1-----------2---------------01
2-----------2---------------10
3…以此类推
在这里插入图片描述
这样可以节省很多空间
在这里插入图片描述
节省内存
那么位段是怎么分配内存的呢?

位段的内存分配

3.2

在这里插入图片描述
根据以下图片分析:
在这里插入图片描述
每次申请1个字节(8个bit位)这里采用了从右向左,浪费操作。
在这里插入图片描述
在这里插入图片描述
按照16进制来表达时:0x620304。
浪费的bit用0来填补
在这里插入图片描述
例子:在这里插入图片描述
根据上面的图片可知:
当不够你所要申请的空间,那么就会重新开辟一个空间来容纳你的空间
(如:第一个a申请了2个bit,第二个申请了5个bit,第三个申请10个bit,而第四个要30个bit,那就在申请一个空间来容纳第四个空间!

位段的跨平台问题

在这里插入图片描述
在16位int是2个字节!!!
如果我们把16位看成32位那么这样就会产生不同结果!!!
所以位段是不跨平台的。


总结

1:结构体内存对齐----浪费空间来促进时间;
2:位段-------节省内存;
3:跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMakeLists.txt语法规则:改变行为的变量说明二

一. 简介 前面一篇文章学习了 CMakeLists.txt语法中的 部分常量变量&#xff0c;具体学习提供信息的变量&#xff0c;文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;提供信息的变量说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;提供信息的变量说明二-CSD…

【计算机网络原理】万字长文,持续更新...

文章目录&#x1f970; 计算机网络原理1.2 因特网概述1 网络、互联网&#xff08;互连网&#xff09;和因特网2 因特网发展的三个阶段ISP的概念基于ISP的三层结构的因特网 3 因特网的标准化工作4 因特网的组成 1.3 三种交换方式&#xff1a;电路交换、分组交换和报文交换电路交…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准

文章目录 一、背景二、实验2.1 测评标准和结果2.1.1 文本识别 Text Recognition2.1.2 场景文本中心的视觉问答 Scene Text-Centric VQA2.1.3 文档导向的视觉问答 Document-Oriented VQA2.1.4 关键信息提取 Key Information Extraction2.1.5 手写数学公式识别 Handwritten Mathe…

图片浏览软件-XnView

一、前言 XnView MP / Classic是一款免费的图像查看器&#xff0c;可轻松打开和编辑照片文件。图像查看器支持所有主要的图像格式&#xff08;JPEG&#xff0c;TIFF&#xff0c;PNG&#xff0c;GIF&#xff0c;WEBP&#xff0c;PSD&#xff0c;JPEG2000&#xff0c;OpenEXR&am…

ssm106学生公寓管理系统的设计与实现+jsp

学生公寓管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

matlab例题大全

1.第1章 MATLAB系统环境 1.1 注&#xff1a;plot函数为画图函数。例plot&#xff08;x1,y1,:,x2,y2,*&#xff09;; 1.2 注&#xff1a;root为求根函数。p为方程变量前面系数矩阵。 1.3 注&#xff1a; 2*x3y-1*z 2; 8*x2*y3*z 4; 45*x3*y9*z 23 求&#xff1a;x,y,z的…

python数据分析——大数据和云计算

大数据和云计算 前言一、大数据二、大数据定义三、数据存储单位四、大数据存储技术五、大数据应用技术六、大数据特征七、数据容量八、数据类型的多样性8.1结构化数据8.2半结构化数据8.3非结构化数据 九、获取数据的速度十、可变性十一、真实性十二、复杂性十三、价值十四、云计…

2023下半年软件设计师上午题——冒泡排序

快速排除法&#xff0c;根据冒泡排序特性&#xff0c;每一趟排序都会确实最大/最小值&#xff0c;故升序两趟后&#xff0c;最后两个元素应该是已经排序好的第二大&#xff0c;和最大的元素&#xff0c;所以排除B,D&#xff0c;再因为每次排序都会两两交换&#xff0c;所以排除…

第五十一周:文献阅读+CNN-LSTM-AM

目录 摘要 Abstract 文献阅读&#xff1a;基于CNN-LSTM-AM时空深度学习模型的城市供水预测 现存问题 提出方法 创新点 方法论 CNN-LSTM-AM模型 研究实验 数据集 预处理 评估指标 实验过程 合格性验证 模型实现 总结 摘要 本周阅读的文献《Urban Water Supply …

C#知识|上位机项目主窗体设计思路及流程(实例)

哈喽,你好啊,我是雷工! 昨天练习了登录窗体的设计实现,今天练习上位机项目主窗体的设计实现。 01 主窗体效果展示 02 实现步骤 2.1、添加主窗体 添加窗体,名称:FrmMain.cs 2.2、窗体属性设置 将FrmMain窗体属性FormBorderStyle设置为None,无边框; 将FrmMain窗体属性…

C++进阶 | [2] 多态

摘要&#xff1a;多态的概念&#xff0c;多态的条件&#xff0c;虚函数的重写&#xff0c;抽象类&#xff0c;多态的原理&#xff0c;虚函数与虚函数表&#xff0c;与多态有关的问答题 1. Concept 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就…

python数据分析——数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤4.1.点估计4.2.区间估计4.2.1. 总体方差已知4.2.2总体方差未知 4.3. 假设检验4.4. 假设检验的假设4.5.显著性水平 五、检验统计量六、检验方法七、拒绝域八、假设检验步骤九、重要假设检验方法…

五一假期零碎时间练习学习过的内容(商城版)

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

cloudreve手动添加文件

cloudreve导入本地已有的文件&#xff0c;不需要再次上传 需要更新版本到3.1及更高 在【管理面板】-----【文件】导入 如上图&#xff1a; 选择目标用户、原始路径、目的路径&#xff0c;创建导入任务即可&#xff01;

免费可商用字体素材大全,办公设计字体合集打包166款

一、素材描述 这是一套免费可商用字体素材&#xff0c;这些字体一般会在办公与设计的时候用到&#xff0c;比如&#xff0c;Photoshop、illustrator、Coreldraw、AfterEffects、Indesign、WPS、Office&#xff0c;等等&#xff0c;想要更好更快地办公与设计&#xff0c;字体还…

项目管理【人】概述

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 一、项目涉及到的人 1.1 项目发起人、项目指导委员会和变更控制委员会 项目发起人&#xff08;Sponsor&#xff09; 项目指导委员会&…

翻译《The Old New Thing》 - Why does the CreateProcess function do autocorrection?

Why does the CreateProcess function do autocorrection? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050623-03/?p35213 Raymond Chen 在 2005 年 6 月 23 日 为什么 CreateProcess 函数会进行自动更正&#xff1f; 译注&#xff…

正则表达式_字符匹配/可选字符集

正则表达式&#xff08;Regular Expression&#xff09;也叫匹配模式(Pattern)&#xff0c;用来检验字符串是否满足特 定规则&#xff0c;或从字符串中捕获满足特定规则的子串。 字符匹配 最简单的正则表达式由“普通字符”和“通配符”组成。比如“Room\d\d\d”就这样 的正则…

农作物害虫检测数据集VOC+YOLO格式18975张97类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;18975 标注数量(xml文件个数)&#xff1a;18975 标注数量(txt文件个数)&#xff1a;18975 标…
最新文章