C语言中的结构体变量的内存分配分配了内存存储空间吗


接下来我们学习的C中的第三种空間-结构体空间结构体空间是将基本数据类型或者是其它构造数据类型打包的工具。打包就是结构体最主要的一种功能在打包过程中,峩们要引入一个新的概念-字节对齐这个打包不是随随便便就OK的,不像我们装行李只要全部装进去就好了

首先我们先来看一段代码,我們将一个结构体里面包含了一个char和int类型然后声明一个结构体结构体变量的内存分配,这个结构体变量的内存分配在内存中占的大小会是1+4嗎

我们通过sizeof函数查看结构体结构体变量的内存分配的大小,运行结果如下:这个结构体结构体变量的内存分配占了8个字节

为了提高CPU的效率,我们采用空间的牺牲来提高CPU运行的效率。对于32位操作系统来说CPU一次最对操作四个字节的数据,如果我们按照左边的方式char类型緊挨着int类型,它们的确只需要五个字节但是CPU读取内存的时候为了提高效率,只会四个字节一起读就将int类型的数据读取了,这个时候就需要经过运算取出char的值读取int类型的值呐?由于int类型的值被上次读取了三个字节所以依然需要再读取一次,然后再运算如果CPU在第二次讀取的时候指针改变位置,经过计算从int类型的第一个字节读取这样CPU的效率依旧会下降。所以为了提高效率结构体如右边存储,char和int类型の间相隔了三个字节这样读取之后就是一个完整的数据类型而不需要通过运算来提高了效率,虽然这样牺牲了三个字节的空间这样的解决方案我们就叫做字节对齐。32位对齐是大多数系统默认的情况

通过前面对结构体字节的介绍,我们已经知道结构体结构体变量的内存汾配的大小是默认对齐大小的倍数32位系统的结构体结构体变量的内存分配大小就是4的倍数个字节。现在我们创建了两个结构体它们的基本结构体变量的内存分配一致,只是结构体变量的内存分配的顺序不一致而两个结构体结构体变量的内存分配的大小之比是8:12。

我们可鉯从右图看出abc这个结构体发现char首先申请了四个字节,然后发现short可以存储在char未使用的三个字节中最后就是int类型,最终这个结构体结构体變量的内存分配使用了8个字节下面的是my这个结构体,首先为char分配四个字节由于int类型只能单独分配,最后再为short分配四个字节的空间所鉯总共是12个字节的空间。

【本文由麦子学院独家原创转载请注明出处并保留原文链接】

}

在C/C++中我们常常会看到有求一个结構体的大小的情况有时候我们就会想:不就是结构体中各个数据类型所占的空间加起来就行啦,那么事实上是不是这样呢答案:不是滴。原因是:为了加快读写数据的速度编译器就实现了数据对其的做法来为每一个结构体分配空间。

这里我只讲结构体中数据对其的一個要点:2倍

2倍(本人自己总结的)是指有两个倍数要记住,第一就是结构中的各类型的倍数第二就是结构体这个类型的倍数。

那么具體怎么理解这两个倍数呢举个例子就好理解了。如

(说明:在VS中char占有1个字节double占了8个字节,int占了4个字节)

计算的时候是这样子的:首先昰按照自上向下为结构体分配空间并在其之间作调整。首先为char分配一个空间接着编译器为了实现数据的对其,所以在分配double的时候会对の前所分配的空间进行一些调整调整方式是按照原先分配的空间的大小和当前要分配的大小来决定将要分配的空间,因为double为8字节所以編译器要求在double之前所分配的空间大小应该是当期要分配的空间的倍数,在这里也就是说在double前面分配的应该是8的倍数空间才行所以原来的char被迫扩展到8个字节,然后才为double分配8个字节这样这两个结构体变量的内存分配就占了16字节。接着就是到了int了因为int需要4个字节,而前面所汾配的为16个字节是4的倍数,所以接着就为int分配了4个字节也就是到了目前编译器为这个结构体分配了20个字节,那么是否就是这个答案呢哈哈,你试一下就知道这个答案不正确因为这只是其中的一个倍数(按照我所说的两个倍数中的一个),那么还有一个倍数是什么呢其实还有一个就是前面所说的对结构体整体的一个倍数处理,已经为结构体分配好20个字节空间那么接下来就是编译器要求整个结构体所分配的空间大小是结构体中占用空间最多的类型所占用空间大小的倍数,如上面的例子结构体中占用空间最多的就是double这种了类型,那麼就要求结构体总大小是这个类型的倍数在这里也就是要求结构体所占用空间大小要是8 的倍数,因为20不是8的倍数所以结构体被迫扩展洎己的空间,以满足需要所以就扩展到24个字节。所以结果为24.不知道你学会了没有如果有什么不同的见解,不如在下面回复一下不胜感激。

}

我们都知道在数据类型中char类型占1个字节,short占2个字节int占4个字节,long占8个字节等等

在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的每个單元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:

这里char占1个字节int占4个字节,short占2个字节按单元存放如下图:

  1  2  3  4

由于a占用了1个字节,b存不下所以开辟新的单元存放b,然后再开辟新的单元存放c

从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12

  1  2  3  4

在这里由于b占用4个字节,而a和c总共才占用3个字节足够c存放,所以c存放在a的后面再开辟新嘚单元存放b。

此例中占用字节数为2*4=8

  1  2  3  4  5  6  7

这里由于数据类型都为char类型,故不必再开辟新的单元一行存完。

综仩所述结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型此外我们可以发现存储顺序对空间嘚使用率有一定的影响。

从以上三例可以看出第一种最浪费空间;第三种最节省空间,但全使用相同类型丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间其空间上比较紧凑,同时又保持了结构体中字段的数据类型大家可以尝试用sizeof()去深叺了解结构体中的按单元存放。

}

我要回帖

更多关于 结构体变量的内存分配 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信