首页 > 系统相关 >自定义类型:结构体(一)(含内存对齐细解)

自定义类型:结构体(一)(含内存对齐细解)

时间:2024-11-24 20:33:31浏览次数:7  
标签:字节 自定义 成员 细解 内存 类型 对齐 结构

今天和大家分享自定义类型结构体,话不多说,正文开始:

首先在c语言中我们见到过不少类型,比如:int ,char,float等等,他们叫做内置类型,但他们所包含的内容是比较单一的,倘若我需要一个类型既能放整形又能放浮点型,那以上的内置类型都满足不了我的需求,因此就有了自定义类型,结构体。

1.结构体类型的声明

关于结构体

member-list 是结构体包含的类型

variable-list是创建的全局变量,可以包含创建多个

2.结构体变量的创建和初始化

我们举个例子来演示一下结构体的创建

3.结构体成员访问操作符

当我们想要访问结构体某一个成员的时候,不能像单一类型一样直接使用

比如这里我创建的结构体,我想访问里面的数组,在vs这个编译器上就直接报错了。

->      .

这两个操作符可以用来访问结构体内部的成员

4.结构体内存对齐

了解了结构体内存对齐的方式,我们几句可以知道结构体所占内存的大小。

结构体的内存大小并不是简单的里面的成员内存相加减

我们来看这个例子,明明只有一个整形和一个字符类型,结果却是八个字节,与想象中的不一样,接下来我给大家详细介绍结构体在内存中的存储。

    4.1  结构体内存对齐规则

1.我们来分析第一条规则,假设左边条格是内存格式,右边的数据对应的就是偏移量

2.(1)对齐数,比如我们结构体中第一个是char类型,它占一个字节大小,在vs环境中,与默认对齐数一比, 1<8 ,对齐数就是1,要放在1的整数倍的地址处,因为是第一个成员直接放在偏移量为0这个位置即可;如果不是第一个成员,由于它的对齐数是1,直接放在下一个成员的下面就好

 

(2)对齐形式,比如第一个成员是char类型,第二个成员是int类型,

                                                    int自身大小为4,默认对齐数是8,那么第二个成员应该对齐在地址是4的倍数的地方,而且存放四个字节,中间的三个字节便被浪费掉了,这也就是为什么上面那个结构体的内存大小是8个字节,而不是4+1=5个字节。

3.关于第三条规则,以第二条规则的例子为例,第一个成员char的最大对齐数为1;第二个成员int的最大对齐数是4,   1<4  ,因此这个结构体的内存大小必须是4的倍数,假设结构体对齐之后的内存大小是9,那它为满足是4的倍数,它最终的内存就是12个字节大小,中间的三个字节依旧是被浪费掉了。

4.关于第四条规则,我以下面这个为例,给大家讲解一下,我们创建两个结构体,并且第二个结构体成员中包含结构体变量,那这时候该如何计算大小呢?

我们得到结构体变量是8个字节,最大对齐数是4,那所有的一起比较,最大对齐数是4,总内存刚好是4的倍数16,如果不是,就需要浪费内存空间来对齐到最大对齐数的倍数。

这就是结构体内存对齐相关的知识,这种对齐方式我们可以发现浪费了很多空间,但实际上是有利于内存的读取的,提高了效率,是用空间换时间的一种方式

好的,今天的分享就到此结束了,感谢大家的观看。

各位,共勉。

标签:字节,自定义,成员,细解,内存,类型,对齐,结构
From: https://blog.csdn.net/gycdn/article/details/143820712

相关文章

  • vxe-table 设置单元格对齐方式,左对齐、右对齐
    官网:https://vxeui.com/<template><div><vxe-tableborderheader-align="center"align="left":data="tableData"><vxe-columntype="seq"width="70">......
  • KTL 一个支持C++14写公式的K线工具 - 0.9.2版,通达信mdt全景数据复盘大盘,Qt自定义图表
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL    国内仓库:https://gitee.com/bbqz007/KTL 当前0.9.2新添加功能基于QCharts跟通达信mdt数据文件。使用者能够使用QCharts自定义数据处理图表。......
  • 嵌入式开发 “微观世界”:位、字、字节、字符的精细解读与实战关联
    目录一、位(bit):计算机世界的原子单位1.1.定义1.2.作用1.3.实战关联二、字节(Byte):数据存储与传输的基本单元2.1.定义2.2.应用2.2.1.存储容量的计量2.2.2.数据传输速度的衡量2.2.3.编程与计算机科学中的应用2.3.实战关联三、字(Word):数据处理的高效单位3.1.定......
  • 本博客园自定义样式
    找文章,发现 https://www.cnblogs.com/zhaoqingqing 的博客样式很好,在底部发现是基于ThemeSilencev2.0.2,现在坐着已经更新到v3.0.0-rc2, 作者GitHub:https://github.com/esofar/cnblogs-theme-silence ,自己做了一些小修改。基本可以配置出差不多的,可以参考我的配置:<script>......
  • 扫雷游戏升级版 含递归链式展开(一次展开一片区域) 代码详细解读 C语言
    1、前言:我看了CSDN有很多小伙伴也写了扫雷小游戏但是大部分写的代码都是一次输入坐标只能展开一个位置并没有还原我们小时候最初始的游戏玩法可玩性很低 我在这用函数递归链式展开一片还原最初始游戏提高可玩性 先放效果图↓2、建议:一个程序代码的实现并不是只靠......
  • 深入解析 WezTerm 的自定义功能:键绑定和鼠标绑定
    WezTerm是一个高性能的跨平台终端模拟器,它提供了广泛的自定义选项,包括键绑定和鼠标绑定,使得用户可以根据自己的需求优化操作界面。本文将详细介绍几个关键的自定义功能,解释它们的用途,并展示如何配置这些功能来提升终端使用体验。创建一个键绑定WezTerm的键绑定功能允许用户为......
  • CSS文本属性:字体、加粗、斜体、对齐方式、下划线、首行缩进、字母大小写、字间距,词间
    1.非常常用!!!字体大小:16px、18pxfont-size:大小;字体颜色:red、green、#ff0000、#f00(两个相同的可以省略一个)coror:颜色;2.字体设置字体:Arial,Verdana,Thoma,sans-serif,simsun.....font-family:字体;3.加粗font-weight:xx;xx:下面的单词或整百数值(100-900)。    nor......
  • js和CSS3自定义鼠标特效
    在线预览 下载  这是一款js和CSS3自定义鼠标特效。该特效中,使用一个DIV元素来自定义鼠标,通过CSS代码来构建鼠标的形状,并通过js代码来驱动鼠标的动画。 使用方法 HTML结构基本的HTML结构如下。<!--鼠标形状元素--><divid="cursorBlob"></div><!--页面内容-......
  • 【小记】 Matplotlib 中设置自定义中文字体的正确姿势
    最近做实验涉及到用Matplotlib绘制图表,我希望相同的代码能不仅在本地运行,且还能在GoogleColab,Binder这些线上平台运行。问题就来了,为了在各个平台上都能绘制中文字符,该如何在Matplotlib中使用自定义的字体?(毕竟国外的一些平台不会预装支持中文字符的字体)网上查了一下,很......
  • 二十七步天注定,逆流河上任我行-自定义类型:结构体
    ---当你累到不行,还继续坚持,那就是梦想的力量1.结构体类型的声明2.结构体变量的创建和初始化结构成员访问操作符结构体内存对齐结构体传参1:结构体类型的声明structtag {   member-list;}variable-list;如果说描述一个人的身份数据:structstu{ charna......