字节对齐的计算

       在我们的计算机中,字节是我们管理内存空间的最小单位,因此处理器从内存取出数据一般都是首先找到字节地址所在处,然后取出需要的字节数的内存中的值。那么处理器在取数的时候,有没有一些规则或者说一些效率比较高的方法。我们来介绍一下内存对齐的概念:
    
    访问未对齐的内存,处理器需要做两次访问,然而,对于对齐的内存仅需要一次的访问。那么怎么看这个内存有没有对齐?
    
    这里引出一个自然边界的概念,在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字节;
 
 

转载于:https://www.cnblogs.com/jgliuhui1988/p/8523690.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值