今天和大家分享自定义类型结构体,话不多说,正文开始:
首先在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