C语言自定义类型的用法和占用内存的情况————结构体(包含结构体内存对齐)
C语言的自定义类型就是程序员定义的类型,它是由各种基本类型组合而来的。C语言给程序员提供了三种的自定义类型它们分别是结构体(struct),联合(union),枚举(enum)。
我们先来讨论结构体(struct)。举个栗子,咱们写一个学生的成绩类型,它包括了姓名,学号,成绩三部分。
下面我们来创建个学生类型的变量。下面我们进行赋值。如果结构体里边嵌入了一个结构体也是一样写法。
你会发现,只是赋值时多加了一层而已。
下面我们来找结构体成员变量。
相似的,嵌套结构体找成员变量也是多加一层。
基本数据类型大小是规定好的,自定义类型的大小该怎么计算呢?已知成员变量包含了20字节的字符串,一个4字节的整形,还有一个1字节的字符变量。加在一起是22个字节。 我们在vs编译器下跑程序来验证一遍。并不是我们想象的那样简单,这是因为结构体在内存发生了变化我们把这种变化叫做结构体内存对齐。
有四条原则
1.结构体的第一个成员对齐到结构体内存的0位置处。
2.从第二个成员开始,要对齐到对齐数的整数倍处。对齐数是结构体成员自身类型大小和默认对齐数的较小值。vs默认对齐数是8。
3.结构体的总大小必须是最大对齐数的整数倍。每个结构体成员都有一个对齐数,他们中最大对齐数就是最大对齐数
4.如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。
我们还是以学生信息的这个结构体为例我们可以算出该结构体目前是25个字节。但是结构体的最终字节数必须是结构体最大对齐数的整数倍。我们可以看到最大对齐数是4。所以总内存是28字节
注意,这里比较的是数据的类型不是数据总共占用的大小。
嵌套的类型也是如此,
我们可以看到后来的base结构体的大小是8字节最大对齐数是4,嵌套进student后就应该从28处开始算,到35处结束。嵌套后的结构体的最大对齐数也是4。共计36字节正好是最大对齐数的整数倍。
到这里结构体就讨论完了,为了避免使用结构体后造成内存的浪费我们应该在写结构体的时候将char类型尽量放在一起。
看到这里希望各位大大帮本猪人点赞,这对本猪人非常重要。叩首~
牛牛要坚持: 优质好文,支持大佬
奋斗小温: 好文章,受益匪浅
爱吃大白菜 : 总结得很到位呀!!感谢博主的分享
也很忙: 感谢支持
m0_73993905: 博主整理的非常详细,转发了