解锁C语言结构体的力量(进阶)

news2024/11/27 1:19:35

引言:结构体是C语言中的重要部分,也是通向数据结构的一把“钥匙”,之前我们在这篇文章:http://t.csdnimg.cn/fBkBI已经简单的介绍了结构体的基础知识,本篇我们来更进一步的学习结构体。


目录

结构体的内存对齐

结构体对齐规则:😊😊

为什么存在内存对齐?🤔🤔

位段

什么是位段?🎈🎈

位段的内存分配:🎖️🎖️

 位段的跨平台问题:🍟🍟

枚举

枚举的优点:⚾⚾

枚举的使用:🎶🎶

联合(共用体)

联合也是一种特殊的自定义类型:🚢🚢

联合大小的计算:🥯🥯


结构体的内存对齐

#include<stdio.h>
#include<string.h>
int main() {
	struct s1 {
		char a;
		int b;
		char c;
	};
	struct s2 {
		char a;
		char b;
		int c;
	};
	printf("%zd\n", sizeof(struct s1));
	printf("%zd", sizeof(struct s2));
	return 0;
}

 根据运行结果,会不会有这样一个问题,为什么s1和s2两个结构体有同样的数据类型,但是大小却不一样呢?🤔

我们来看一个图解:

所以我们可以看到即使是相同的数据类型,不同的存储顺序,所占的空间也会不一样,灰色的地方就被浪费了。那么这就是一个简单的结构体对齐的体现。

结构体对齐规则:😊😊

1️⃣第一个成员在与结构体变量偏移量为0的地址处。

2️⃣其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。

vs中默认的是8

Linux中没有默认对齐数,对齐数就是成员自身的大小。

3️⃣结构体总大小为最大对齐数(每个成员变量都有一        `个对齐数)的整数倍。

4️⃣如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

为什么存在内存对齐?🤔🤔

1️⃣平台原因(移植原因):

不是所有硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2️⃣性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。

原因在于,为了访问为对齐的内存,处理器需要做两次内存访问;而对齐的内存访问仅需要一次访问。

总体来说:结构体的内存对齐是那空间换取时间的做法。

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

让占用空间的成员尽量集中在一起。

 

位段

什么是位段?🎈🎈

位段的声明和结构是类似的,有两个不同:

1、位段的成员必须是intunsigned intsigned int

2、位段的成员名后边有一个冒号和一个数字

如果不采用位段的话,最低也要16个字节,而我们通过位段可以调节他所占字节的大小,这样有助于我们来节省空间,但是条件较为苛刻,在用之前我们需要明确的直到这个要用多少字节才能准确的给他分配多少。

所以总的来说: 位段是用来节省空间的

位段的内存分配:🎖️🎖️

1、位段的成员可以是int、unsigned int、signed int或者是char(属于整形家族)类型。 

2、位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。

3、位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段。

 位段的跨平台问题:🍟🍟

1、int 位段被当成有符号数还是无符号数是不确定的。

2、位段中最大的数目是不确定的。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

3、位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

4、当一个结构体包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位段时,是舍弃剩余的位还是利用,还是不确定的。

总结:

跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

 

枚举

枚举顾名思义就是一一列举。

把可能的取值一一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举

性别有:男,女,保密,也可以一一列举

月份有12个月,也可以一一列举

这里就可以使用枚举了。

enum Color {//颜色
	REd,
	GREEN,
	BLUE
};

枚举的优点:⚾⚾

我们可以使用#define定义常量,为什么非要使用枚举?🤔🤔

枚举的优点:

1、 增加代码的可读性和可维护性。

2、和#define定义的标识符比较枚举有类型检查,更加严谨。

3、便于调试。

4、使用方便,;一次可以定义多个常量。

枚举的使用:🎶🎶

enum color{//颜色
    RED = 1,
    GREEN = 2,
    BLUE = 4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

 

联合(共用体)

联合也是一种特殊的自定义类型:🚢🚢

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

我们会发现,按结构体类型来说,char和int类型一共是5字节,而放在union里面则变成了4个字节,原因就是char和int公用一块空间。

蓝色区域为char和int的公用部分

 

而且我们将两个地址打印出来会发现是同一块地址。 进一步证明了什么是共用体。

联合大小的计算:🥯🥯

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐的整数倍的时候,就要对齐到最大整数倍

例如:

 好了,今天就带给大家这么多,感谢大家的支持!!!

🚗🚗🚗

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

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

相关文章

二维码是啥?

大家好&#xff0c;我是tony4geek。 今天说下二维码。二维码我们每天都在使用。本文将深入探讨二维码的识别原理&#xff0c;了解其背后的技术和算法&#xff0c;以及它是如何将编码的信息解析成可读的文本或链接的。 一、二维码的基本结构 在探讨二维码的识别原理之前&…

这个国庆婚礼是一场接一场的到来,好幸福

爸妈参加了姐姐的游轮婚礼&#xff0c;爸爸诗兴大发作诗一首&#xff0c;虽然没能亲临&#xff0c;但我妈一直有小视频实时转播&#xff0c;新婚的幸福也已经感受到了&#xff01;

自动驾驶学习笔记(二)——Apollo入门

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Ubuntu Linux文件系统 Linux指令…

小程序+Php获取微信手机号

当前通过获取session_key与encryptedData与iv进行解密获取手机号的方法已经不行了,只能通过点击按钮来实现获取微信用户的手机号 1&#xff1a;需要将 button 组件 open-type 的值设置为 getPhoneNumber&#xff0c;当用户点击并同意之后&#xff0c;可以通过 bindgetphonenum…

如何开始学习量子机器学习

一、关于量子计算 这是我关于量子机器学习&#xff08;QML&#xff09;的第二篇文章&#xff0c;这是第一篇&#xff0c;关于为什么你应该开始学习QML。 开始研究量子机器学习很困难&#xff0c;因为我不知道我需要了解多少量子力学和计算知识。我在101年上大学时上了量子力学2…

【计算机网络-自顶向下方法】应用层(SMTP、POP3、DNS)

目录 1. Electronic Mail电子邮件应用画像1.1 电子邮件系统1.2 邮件报文格式1.3 邮件访问 2. DNS&#xff08;Domain Name System&#xff09;2.1 DNS提供的服务2.2 DNS工作机理2.3 DNS资源记录2.4 DNS协议&#xff0c;报文2.5 小结 1. Electronic Mail 电子邮件应用画像 应用…

操作系统备考学习 day7 (2.3.4 ~ 2.3.5)

操作系统备考学习 day7 第二章 进程与线程2.3 同步与互斥2.3.4 信号量 用信号量实现进程互斥、同步、前驱关系信号量机制实现进程互斥信号量机制实现进程同步信号量机制实现前驱关系 2.3.5 经典同步问题生产者-消费者问题多生产者和多消费者模型抽烟者问题读者-写者问题哲学家进…

挑选一款优秀的Web端项目管理软件

Web端的项目管理软件哪个好用&#xff1f;Zoho Projects是一款本土化成熟的国外项目管理软件。选择Zoho Projects最重要的原因除了项目管理工具的基本能力和高级能力它都基本具备、操作上更符合习惯之外&#xff0c;还值得一提的是拥有很多自定义配置的能力&#xff0c;满足我们…

FPGA实现HDMI输入转SDI视频输出,提供4套工程源码和技术支持

目录 1、前言免责声明 2、我目前已有的SDI编解码方案3、设计思路框架核模块解析设计框图IT6802解码芯片配置及采集ADV7611解码芯片配置及采集silicon9011解码芯片配置及采集纯verilog的HDMI 解码模块RGB888转YUV422SPMTE编码SDI模式图像缓存SPMTE SDIGTXGV8500 4、vivado工程1-…

CLIP与DINOv2的图像相似度对比

在计算机视觉领域有两个主要的自监督模型:CLIP和DINOv2。CLIP彻底改变了图像理解并且成为图片和文字之间的桥梁&#xff0c;而DINOv2带来了一种新的自监督学习方法。 在本文中&#xff0c;我们将探讨CLIP和DINOv2的优势和它们直接微妙的差别。我们的目标是发现哪些模型在图像相…

PostgreSQL ash —— pgsentinel插件 学习与踩坑记录

零、 注意事项 测试发现&#xff0c;pgsentinel插件在pg_active_session_history视图记录条数较多时&#xff0c;存在严重的内存占用问题&#xff0c;群里的其他朋友反馈还可能存在严重的内存泄漏问题。本文仅用于学习和测试&#xff0c;未用于生产环境。 设置 pgsentinel_ash.…

Android平台实现lottie动画

1、lottie动画简介 Lottie 是一个应用十分广泛动画库&#xff0c;适用于Android、iOS、Web、ReactNative、Windows的库&#xff0c;它解析了用Bodymovin导出为json的Adobe After Effects动画&#xff0c;并在移动和网络上进行了原生渲染。它提供了一套完整得从AE到各个终端的…

c++ 学习 之 继承中 父类子类构造函数和析构函数的调用顺序

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;// 继承中的对象模型class Base { public:Base(){cout << "Base 的构造函数 " << endl;}~Base(){cout << "Base 的析构函数 " << endl;} };clas…

2023年【通信安全员ABC证】找解析及通信安全员ABC证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 通信安全员ABC证找解析参考答案及通信安全员ABC证考试试题解析是安全生产模拟考试一点通题库老师及通信安全员ABC证操作证已考过的学员汇总&#xff0c;相对有效帮助通信安全员ABC证考试总结学员顺利通过考试。 1、【…

业务平台为测试带来的挑战

“业务平台”是指 中间平台&#xff0c;其上游有底层系统支撑&#xff0c;其下游有客户群体。因为平台下游承接大量客户群体&#xff0c;客户对应用的行为极其敏感&#xff0c;一些小故障比如闪屏、按钮失灵&#xff0c;落数失败会有很大概率引起客诉。 客诉对公司整体的影响 …

山体滑坡监测预警系统

在面对自然灾害和地质灾害的严峻挑战时&#xff0c;人们对于科技的需求和依赖更加强烈。山体滑坡&#xff0c;作为一种常见的地质灾害&#xff0c;其不可预测性和潜在的巨大破坏力令人深感忧虑。然而&#xff0c;随着山体滑坡监测预警系统的出现&#xff0c;人们有了一个强有力…

【计算机视觉 05】YOLO论文讲解:V1-V7

https://ai.deepshare.net/live_pc/l_63243a65e4b050af23b79338 Part1.目标检测与YOLO系列 1. 目标检测任务及发展脉络 2. YOLO的发展史 Anchors Base原理&#xff1a; Part2.YOLOV1-V3 3. YOLO V1的网络结构 4. YOLO V3的网络结构与实验结果 Part3.YOLO的进化 5. YOLO V4的网络…

Python实现收发邮件

在实际开发中&#xff0c;当你收到一个需求的时候&#xff0c;比如要做一个「收发邮件」的功能。 如果你完全没有印象&#xff0c;没有思路&#xff0c;可以直接 Google 搜索的。 因为我们不可能对每个知识点都了解&#xff0c;不了解不可耻&#xff0c;但要懂得怎么去找资料…

用全栈智能,联想如何“零故障”支持亚运会?

作者 | 曾响铃 文 | 响铃说 1912年&#xff0c;电子计时器首次应用&#xff0c;1936年&#xff0c;体育赛事首次在电视上播出&#xff0c;1972年计算机首次进入人类赛事&#xff0c;1996年互联网技术大范围应用&#xff0c;随后3G网络、3D技术、VR技术……以奥运会为代表&…

Domain Enhanced Arbitrary Image Style Transfer via Contrastive Learning

ABSTRACT 在这项工作中&#xff0c;我们使用一种新颖的风格特征表示学习方法来解决任意图像风格转移的挑战性问题。合适的风格表示作为图像风格化任务的关键组成部分&#xff0c;对于获得满意的结果至关重要。 现有的基于深度神经网络的方法在内容特征的Gram矩阵等二阶统计量…