结构体是我们C语言中非常常见的一种复合数据类型,它的出现解决了那种比较复杂,抽象的事物描述,同时改善了这种函数参数较多容易出错的情况,当我们一下子需要好些变量时,我们完全可以用结构体去代替那些很多的变量。当然在C语言中,还有一些其他的复合类型,如union,enum...
这里我重点讲一下结构体的内存占用空间大小与内存空洞问题。
这里我重点讲一下结构体的内存占用空间大小与内存空洞问题。
在我们的计算机中,字节是我们管理内存空间的最小单位,因此处理器从内存取出数据一般都是首先找到字节地址所在处,然后取出需要的字节数的内存中的值。那么处理器在取数的时候,有没有一些规则或者说一些效率比较高的方法。我们来介绍一下内存对齐的概念:
访问未对齐的内存,处理器需要做两次访问,然而,对于对齐的内存仅需要一次的访问。那么怎么看这个内存有没有对齐?
这里引出一个自然边界的概念,在C语言中,基础的数据类型有char,short,int,unsigned char ,unsigned int,double,float.....
那么每一种数据类型的自然边界都是不一样的,反过来讲,每一种数据类型的对齐方式是不一样的。比如char类型的数据,它的自然边界是任意地址,因此对齐方式是一个字节,short类型的数据,它的自然边界是偶数地址,因此对齐方式是二个字节,int类型的数据,它的自然边界是能被4整除的地址,因此对齐方式是4个字节,double类型的数据(字节大小是8字节),但是它的自然边界是能被4整除的地址,因此对齐方式还是4个字节(有些参考书上是按照字节数对齐
访问未对齐的内存,处理器需要做两次访问,然而,对于对齐的内存仅需要一次的访问。那么怎么看这个内存有没有对齐?
这里引出一个自然边界的概念,在C语言中,基础的数据类型有char,short,int,unsigned char ,unsigned int,double,float.....
那么每一种数据类型的自然边界都是不一样的,反过来讲,每一种数据类型的对齐方式是不一样的。比如char类型的数据,它的自然边界是任意地址,因此对齐方式是一个字节,short类型的数据,它的自然边界是偶数地址,因此对齐方式是二个字节,int类型的数据,它的自然边界是能被4整除的地址,因此对齐方式是4个字节,double类型的数据(字节大小是8字节),但是它的自然边界是能被4整除的地址,因此对齐方式还是4个字节(有些参考书上是按照字节数对齐