字节对齐的计算

Posted 风的哀伤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节对齐的计算相关的知识,希望对你有一定的参考价值。

       在我们的计算机中,字节是我们管理内存空间的最小单位,因此处理器从内存取出数据一般都是首先找到字节地址所在处,然后取出需要的字节数的内存中的值。那么处理器在取数的时候,有没有一些规则或者说一些效率比较高的方法。我们来介绍一下内存对齐的概念:
    
    访问未对齐的内存,处理器需要做两次访问,然而,对于对齐的内存仅需要一次的访问。那么怎么看这个内存有没有对齐?
    
    这里引出一个自然边界的概念,在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 };
PS:sizeof(a4)=12  a char类型 任意地址开始 ;  b int类型 以能被4整除的地址开始,因此a空出来3个字节(空洞); c char类型 任意地址开始 但是整个结构体的小要是4的倍数 因此c多出来3个字节(空洞)因此1+3+4+1+3=12字节
    

1 struct a5
2 {
3       char b;
4       char c1;
5       int a;
6       char c2;
7       char c;
8 };
PS:sizeof(a5)=12 b char类型 任意地址开始 ;c1 char类型 任意地址开始 ; b int类型 以能被4整除的地址开始,因此b和c1一起空出来2个字节(空洞); a int类型 以能被4整除的地址开始 ;c2 char类型 任意地址开始 ;c char类型 任意地址开始 ; 但是整个结构体的小要是4的倍数 因此c2和c一起空出来2个字节(空洞)因此1+1+2+4+1+1+2=12字节;
   

1 struct a6
2 { 
3       char b;
4       short a1;
5       short b1;
6       int a;
7       char c2;
8       char c;
9 };
PS:sizeof(a5)=12  b char类型 任意地址开始 ;a1 short类型 以能被2整除的地址开始 因此b空出来1个字节 ; b1 short类型 以能被2整除的地址开始; a int类型 以能被4整除的地址开始,因此b1空出来2个字节 ;c2 char类型 任意地址开始 ;c char类型 任意地址开始 ; 但是整个结构体的小要是4的倍数 因此c2和c一起空出来2个字节(空洞)因此1+1+2+2+2+4+1+1+2=16字节;
 
 

以上是关于字节对齐的计算的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体字节对齐

计算机组成原理——大小端模式与边界对齐

计算机组成原理——大小端模式与边界对齐

指定字节对齐方式

字节对齐

八字节对齐