结构体介绍(2)

news2024/11/16 16:29:39

结构体介绍(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.coloradmin.cn/o/1643881.html

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

相关文章

金融行业AI大模型百项应用案例综述【大模型系列】

逐浪金融大模型的玩家&#xff0c;除了BAT、华为等高科技巨头&#xff0c;试图以技术优势充当产业链的“卖铲人”&#xff0c;更多的还是金融和类金融企业&#xff0c;包括银行、保险、互金、券商等&#xff0c;既不想被喧宾夺主&#xff0c;又不想肥水外流&#xff0c;都在押注…

基于Springboot的校园竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

VS2019下使用MFC完成科技项目管理系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识&#xff0c;熟练应用数据库知识&#xff0c;通过处理过程对计算机软件系统工作原理的进一步理解&am…

新型直膨式光伏光热热泵/动力热管复合循环系统

太阳能光伏光热热泵&#xff08;即PVT热泵&#xff09;技术是建筑领域内实现碳中和的有效技术手段&#xff0c;该技术具有优越的热电冷联产能力。然而&#xff0c;现有的PVT热泵在良好的室外工况下能耗较高。为了解决这一问题&#xff0c;本文提出了一种新型的DX-PVT热泵/动力热…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

【电源专题】拿人体的循环系统与板级电源做个比较

一般人可能会觉得电源大概是电子设备里面比较容易搞定的门类。因为,只要线路没有接错,指示灯(如果有)能亮,电源都能工作。从这个方面说,好像是很容易。但是通过多年的经验和经历的坑,发现电源其实是一个很麻烦的东西,稍微有一点不完美就会有大问题出现。 如果将人体也当…

cloudreve手动添加文件

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

[C++基础学习-06]----C++指针详解

前言 指针是一个存储变量地址的变量&#xff0c;可以用来访问内存中的数据。在C中&#xff0c;指针是一种非常有用的数据类型&#xff0c;可以帮助我们在程序中对内存进行操作和管理。 正文 01-指针简介 指针的基本概念如下&#xff1a; 声明指针&#xff1a;使用“*”符…

AI+客服行业落地应用

一、客服行业变迁 1.传统客服时代 &#xff08;1&#xff09;客服工作重复性高&#xff0c;技术含量低 &#xff08;2&#xff09;呼出效率低&#xff0c;客服水平参差不齐 &#xff08;3&#xff09;管理难度高&#xff0c;情绪不稳定 &#xff08;4&#xff09;服务质量…

【系统架构师】-选择题(十三)

1、在某企业的营销管理系统设计阶段&#xff0c;属性"员工"在考勤管理子系统中被称为"员工"&#xff0c;而在档案管理子系统中被称为"职工"&#xff0c;这类冲突称为&#xff08; 命名冲突&#xff09;。 同一个实体在同系统中存在不同的命名&am…

2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP

“天一永安杯”2024 宁波第七届网络安全大赛暨第九届大学生网络技术与信息安全大赛 大赛竞赛形式 一、线上初赛 参赛人员&#xff1a;各单位自行选拔3人&#xff08;设队长1名&#xff09;组成团队&#xff0c;不足3人不允许参赛。 竞赛时间&#xff1a;8&#xff1a;30-12&…

15 C语言常用函数

C语言常用函数 本次笔记参考哔站尚硅谷宋红康老师的C语言教程。 C语言是一种广泛应用的编程语言&#xff0c;它提供了一系列的标准库函数&#xff0c;使得程序员能够更高效地编写程序。函数是C语言编程中的基础&#xff0c;通过它们&#xff0c;程序员可以构建出功能丰富的应用…

牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0 核心 二分查找Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

泰克示波器电流探头如何抓浪涌电流波形?

泰克示波器是一种常见的电子测量仪器&#xff0c;广泛应用于电子工程、通信工程、医疗设备等领域。它的主要功能是实时显示电信号的波形&#xff0c;从而帮助工程师和技术人员分析和调试电路。而在一些特定的应用场景中&#xff0c;例如电源、电机、电器设备等&#xff0c;我们…

神经网络之防止过拟合

今天我们来看一下神经网络中防止模型过拟合的方法 在机器学习和深度学习中&#xff0c;过拟合是指模型在训练数据上表现得非常好&#xff0c;但在新的、未见过的数据上表现不佳的现象。这是因为模型过于复杂&#xff0c;以至于它学习了训练数据中的噪声和细节&#xff0c;而不…

基于EBAZ4205矿板的图像处理:12图像二值化(阈值可调)

基于EBAZ4205矿板的图像处理&#xff1a;12图像二值化(阈值可调) 先看效果 板卡拿回寝室了&#xff0c;明天晚上再补充实际运行效果 我的项目是可以通过按键调整二值化的阈值的&#xff0c;key1为阈值加1&#xff0c;key2为阈值减1&#xff0c;key3为阈值加10&#xff0c;ke…

vue初始化项目

打开终端输入vue create project-name 选择Manually select features回车&#xff0c;继续选择如下&#xff1a; 如果要使用pina就可以不选vuex&#xff0c;回车&#xff0c;选择如下&#xff1a; 按下图选即可

SX1301 1MHz、2A升压电流模式PWM转换器芯片IC

一般说明 S1301是直流-直流之间的a电流。安装Wμ电路内置0.25Ω功率MOSFET&#xff0c;使此稳压器高功率效率。内部补偿网络还可最大限度地减少多达6个外部元件数量。误差放大器的同相输入端接0.6V精密基准电压&#xff0c;内部具有软启动功能&#xff0c;可以减小浪涌电…

Hikyuu-SYS-趋势双均线交易策略实现

本篇中&#xff0c;我们将通过技术分析流派中经典的“趋势双均线策略”&#xff0c;向大家展现如何 Hikyuu 来测试自己的想法&#xff0c;并最终将它转化为策略&#xff01; 准备工作 下面的代码在 Jupyter Lab 中执行&#xff0c;和直接使用 .py 文件执行的区别主要在于 matp…

C语言--带环链表问题

继续学习 一、判断链表是否带环 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用快慢指针&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;当慢指针走一半快指针进到环里 当慢指针进环&#xff0c;快指针已经在环中转了一会儿了 | |…