在我们的计算机中,字节是我们管理内存空间的最小单位,因此处理器从内存取出数据一般都是首先找到字节地址所在处,然后取出需要的字节数的内存中的值。那么处理器在取数的时候,有没有一些规则或者说一些效率比较高的方法。我们来介绍一下内存对齐的概念:
访问未对齐的内存,处理器需要做两次访问,然而,对于对齐的内存仅需要一次的访问。那么怎么看这个内存有没有对齐?
这里引出一个自然边界的概念,在C语言中,基础的数据类型有char,short,int,unsigned char ,unsigned int,double,float.....
那么每一种数据类型的自然边界都是不一样的,反过来讲,每一种数据类型的对齐方式是不一样的。比如char类型的数据,它的自然边界是任意地址,因此对齐方式是一个字节,short类型的数据,它的自然边界是偶数地址,因此对齐方式是二个字节,int类型的数据,它的自然边界是能被4整除的地址,因此对齐方式是4个字节,double类型的数据(字节大小是8字节),但是它的自然边界是能被4整除的地址,因此对齐方式还是4个字节(有些参考书上是按照字节数对齐,也是是8个字节对齐)。。。
讲到这里,你应该知道内存对齐的玩法了吧!
如果还没明白,没关系,请看下面各种例子
这里引出一个自然边界的概念,在C语言中,基础的数据类型有char,short,int,unsigned char ,unsigned int,double,float.....
那么每一种数据类型的自然边界都是不一样的,反过来讲,每一种数据类型的对齐方式是不一样的。比如char类型的数据,它的自然边界是任意地址,因此对齐方式是一个字节,short类型的数据,它的自然边界是偶数地址,因此对齐方式是二个字节,int类型的数据,它的自然边界是能被4整除的地址,因此对齐方式是4个字节,double类型的数据(字节大小是8字节),但是它的自然边界是能被4整除的地址,因此对齐方式还是4个字节(有些参考书上是按照字节数对齐,也是是8个字节对齐)。。。
讲到这里,你应该知道内存对齐的玩法了吧!
如果还没明白,没关系,请看下面各种例子
1 struct a1 2 { 3 4 };
PS:sizeof(a1)=0 空结构体的大小根据编译器来决定,0或者1;
1 struct a2 2 { 3 int a; 4 int b; 5 };
PS:sizeof(a2)=8 a int类型 以能被4整除的地址开始 ;b同a一样 因此4+4=8字节;
1 struct a3 2 { 3 int a; 4 char b; 5 };
PS:sizeof(a3)=8 a int类型 以能被4整除的地址开始 b char类型 任意地址开始 但是整个结构体的小要是4的倍数 因此b多出来3个字节 (空洞) 因此4+1+3=8字
1 struct a4 2 { 3 char b; 4 int a; 5 char c; 6 };
1 struct a5 2 { 3 char b; 4 char c1; 5 int a; 6 char c2; 7 char c; 8 };
1 struct a6 2 { 3 char b; 4 short a1; 5 short b1; 6 int a; 7 char c2; 8 char c; 9 };