结构体,自定义类型

news2024/11/23 0:47:57

目录

结构体

结构体的声明

结构体的自引用

结构体的定义和初始化

结构体内存对齐

​编辑

结构体的对齐规则:

 为什么存在内存对齐?

修改默认对齐数

 结构体传参

位段

什么是位段

位段的内存分配

 位段的跨平台问题

枚举

联合(共用体)

联合体的大小计算


结构体

结构体的声明

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。

结构体的关键字是struct 后面的Stu是结构体类型名,由我们自己定义,s1,s2是结构体变量,age和name是成员,即结构体变量中有各自的成员。

结构体还有一种特殊的声明,即匿名结构体。如下图:

 这种声明省略了结构体类型名,该声明不常用,因为他是一次性的,即在后面就不能继续对他定义了。

结构体的自引用

结构体的自引用就是在结构体成员中包含自身结构体类型的指针。

如上图, p指针可以用来指向下一节点。

结构体的定义和初始化

如上图,在初始化时,我们用花括号括起来,在里面赋值。初始化时,如果我们也可乱序定义。

先用.(成员运算符)然后加上成员名,再进行初始化即可,如下图。

 如下图,我们可以在结构体中嵌套结构体。

结构体内存对齐

如上图,可以看到,结构体的内存大小并不是平常的类型大小相加。这里涉及了结构体内存的对齐。

offsetof是一个宏,可以直接使用,是用来计算结构体成员相较于起始位置的偏移量的。

上图是S1占用空间的示意图,结合下面的规则,我们来分析。

分析:c1是第一个成员,起始位置从0开始。i是int型,与8相比,4为较小值,他的对齐数则为4,寻找最近的4的倍数,则从4开始占用,接着c2是char型,对齐数则为1,直接补在i后面即可,这3个成员中,对齐数分别为1,4,1,最大对齐数是4,总大小就是4的倍数,就需要再浪费3个空间。

结构体的对齐规则:

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

 为什么存在内存对齐?

 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平        台只能在某些地址处取得某些特定类型的数据,否则抛出硬件异常。

  2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对       齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

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

举个例子:

红框是存储的数据,当我们 要读取i时,第一次只读取到前3个字节,需要读取两次才能完全读取到i,这是不对齐的情况。

当结构体内存对齐时,虽然中间的空间浪费了,但这时我们能一次读取到需要的数据,减少了花费的时间。 

所以在设计结构体的时候,我们既要节省空间,又要满足对齐,就需要让占用空间小的成员尽量集中在一起 。

修改默认对齐数

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

如上图,第一个指令,把默认的对齐数改为4,最后一个指令,是恢复成原本的默认对齐数。 

 结构体传参

如上图,第一种是传值,第二种是传址。函数传参的时候,参数是要压栈的,会有时间和空间上的系统开销。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下能。因此,结构体传参的时候,要传结构体的地址。 

位段

什么是位段

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

1.位段的成员必须是int,unsigned int,或signed int。

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

如上图, 是位段的声明,a占用了两个bit位的空间,位段能节省空间的占用。例如,假设a只可能是0,1,2,3,即二进制为00,01,10,11,如果我们不使用位段的方式,一个整形就要占32个bit位,实际上,位段也会浪费少量的空间。

位段的内存分配

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

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

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

 位段的跨平台问题

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

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

枚举

枚举,顾名思义就是一一列举,把可能的取值一一列举。

花括号中的内容是枚举类型的可能取值,也叫枚举常量。

这些可能取值都是有值的,默认从0开始,依次递增1。当然,在声明枚举类型的时候也可以赋初值。

联合(共用体)

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

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

联合体的大小计算

联合体的大小并不是最大成员的大小。

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

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

如上图, 实际上,c是数组,因为有5个元素,占了五个字节,但他的对齐数依旧是1,而i的对齐数是4,比5大的4的倍数最小是8,所以大小就是8。 c和i和该联合体的起始地址都是一样的,他们共用一块空间,因此可以节省空间。

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

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

相关文章

vivado sdk mem超出

Description Resource Path Location Type region microblaze_0_local_memory_ilmb_bram_if_cntlr_Mem_microblaze_0_local_memory_dlmb_bram_if_cntlr_Mem’ overflowed by 4288 bytes uart C/C Problem 问题的产生:fpga使用了microblaze搭建了一个soc系统&#…

SRC挖掘漏洞XSS

Markdown是一种轻量级标记语言,创始人为约翰格鲁伯(John Gruber)。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的…

ESP32-Web-Server编程-通过 Base64 编码在网页中插入图片

ESP32-Web-Server编程-通过 Base64 编码在网页中插入图片 概述 不同于上节 ESP32-Web-Server编程-在网页中通过 src 直接插入图片,本节引入 Base64 编码来显示图片。 Base64 是一种用64个字符来编码表示任意二进制数据的方法。任何符号都可以转换成 Base64 字符集…

VMware提示:此虚拟机似乎正在使用中,取得该虚拟机的所有权失败错误的解决方案

当你遇到这个的时候是不是很疑惑,现在给你解决方案 step1: 先找到配置文件目录 D:\centOs7_mini\ 这里写成你的这个 step2: 在这个地方查找最后面是 .vmx.lck文件夹,然后进行修改、删除、移动都可以 step3: 去虚拟机那边重新启动就行

【C语言快速学习基础篇】之一基础类型、进制转换、数据位宽

文章目录 一、基础类型(根据系统不同占用字节数会有变化)1.1、有符号整形1.2、无符号整形1.3、字符型1.4、浮点型1.5、布尔型 二、进制转换2.1、二进制2.2、八进制2.3、十进制2.4、十六进制2.5、N进制2.6、进制转换关系对应表 三、数据位宽3.1、位3.2、字节3.3、字3.4、双字3.5…

2023年快结束了,来看看你使用的编程语言在排行榜上排名第几?

【关注微信公众号:跟强哥学SQL,回复“笔试”免费领取大厂SQL笔试题。】 废话不多说,直接上图(双击图片查看大图): 这张编程语言排行榜来源于tiobe.com网站,根据TIOBE编程社区指数进行排名&…

黑苹果之主板篇

一、什么是主板 主板,又叫主机板(mainboard)、系统板(systemboard)、或母板(motherboard),是计算机最基本的同时也是最重要的部件之一。主板一般为矩形电路板,上面安装了…

主食罐头哪个牌子好?猫主食罐头品牌分享

进口的猫罐头在近期确实经历了一些困难。由于疫情的影响,许多货品无法正常进口;而最近禽流感的问题也对备受好评的德罐品牌造成了重大冲击。 然而,我们国内生产的猫罐头产品在这段时间展现出了出色的表现。我们推出了许多优质产品&#xff0…

交叉验证以及scikit-learn实现

交叉验证 交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题。 主要有三种方式: 简单交叉验证(HoldOut检验)、k折交叉验证(k-fold交叉验证)、自助法。 本文仅针对k折交叉验证做详细解…

【项目】学生信息管理系统

概述 本系统总耗时 6 6 6 天,包括 学生发展与数据驱动平台6.2.cpp、学生信息.txt、用户账号.txt、注意事项.txt。由于代码对文件的调用使用的是相对路径,所以要求这 4 4 4 个文件都需要在同一目录。使用代码前先仔细看 注意事项。 如图: …

代码随想录算法训练营 ---第五十八天

今天开启单调栈的征程。 第一题: 简介: 本题有两种解法,第一种:暴力破解 两层for循环 时间复杂度为O(n^2) 超时了 第二种:单调栈解法也是今天的主角。 单调栈是什么? 单调递增栈:单调递增栈…

Centos7部署Graylog5.2日志系统

Graylog5.2部署 Graylog 5.2适配MongoDB 5.x~6.x,MongoDB5.0要求CPU支持AVX指令集。 主机说明localhost部署Graylog,需要安装mongodb-org-6.0、 Elasticsearch7.10.2 参考: https://blog.csdn.net/qixiaolinlin/article/details/129966703 …

22 查找众数及中位数

题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数9是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就…

tomcat环境搭建

镜像下载地址:https://mirror.tuna.tsinghua.edu.cn/apache/tomcat/ 配置环境变量 添加系统变量 编辑Path 测试 dos窗口运行startup启动tomcat 访问http://localhost:8080/

2023年最新prometheus + grafana搭建和使用

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户: -M 不创建家目录, -s 不让登录 useradd…

YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版

点击阅读YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版原文 YITH WooCommerce Product Bundles Premium电商商城产品捆绑销售高级版的作用是在您的商店中创建特别优惠,将产品捆绑在一起提供折扣和特价。 您如何从中受益: 您将…

YOLO的全面综述:从YOLOv1到最新版本

文章目录 摘要1、简介2、YOLO在不同领域的应用3、目标检测的度量标准和非最大值抑制(NMS)3.1. AP如何工作?3.2. 计算AP3.3、非极大值抑制(NMS) 4、YOLO: You Only Look Once4.1、YOLOv1的工作原理4.2、YOLOv1架构4.3、…

数学术语之源——全纯函数(holomorphic)

1. “holomorphic” 和 “meromorphic”的词源 术语“全纯函数(holomorphic function)”和“亚纯函数(meromorphic function)”由Charles A. A. Briot (1817-1882) 和Jean-Claude Bouquet (1819-1885)在<<椭圆函数理论>>(Thorie des fonctions elliptiques)(1859年…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期&#xff0c;多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此&#xff0c;还与Windows等主流老牌操作系统并列&#xff0c;并且排在首位介绍。 此外&#xff0c;今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

怎么压缩过大的GIF动图?三种方法随心选!

GIF图片由于其图片格式&#xff0c;本身就会很大&#xff0c;但是微信QQ还有一些其他的社交平台对上传的表情包是有限制的&#xff0c;这个时候就需要借助一些图片处理工具对GIF进行压缩。 下面就向大家介绍三种好用的方法并展示具体的操作步骤。 一、使用嗨格式压缩大师进行压…