自然对齐/指定字节对齐---个人笔记

  关于字节对齐,有时候真的不是很清楚,每个编译器都有自己的规定,而大多数都遵循自然对齐:就是取该数据结构中所占内存空间最大的那个变量对齐(先检查占内存较大的那个的大小,而其后的变量则向其靠齐)

typedef struct aa{

  char a;

  short b;  

}_aa;

_aa A;

A.a='1';

A.b=7788;

sizeof(A)? 答案为4.他们怎么存放的?小端模式下:

    --------0x0

  a |  '1' |0x1

  b | 88 |0x2

    | 77  |0x3

    |  *  |

    --------

 

那么这个呢?

typedef struct _aa{

 

  char a;

 

  int   b;  

 

}__aa;

__aa A;

A.a='1';

A.b=123456;

sizeof(__aa)? 答案为8. 他们怎么存放的?

   --------0x0

  a |   '1'   |0x0

     |    0   |0x1

     |    0   |0x2

     |    0   |0x3

  b | 56 |0x4

     | 34  |0x5

     |  12   |0x6

     |  00   |0x7

    --------

 

#include <stdio.h>
typedef struct stu1{    
  char array[7];
}stu1;
typedef struct stu2{    
  double fa;
}stu2;
typedef struct stu3{    
  stu1 s;
  char str;
}stu3;
typedef struct stu4{    
  stu2 s;
  char str; 
}stu4;
void main()
{
  printf("sizeof(stu1) :\t%d\n",sizeof(stu1)); 
  printf("sizeof(stu2) :\t%d\n",sizeof(stu2));
  printf("sizeof(stu3) :\t%d\n",sizeof(stu3));
  printf("sizeof(stu4) :\t%d\n",sizeof(stu4));
}

sizeof(stu1) : 7
sizeof(stu2) : 8 
sizeof(stu3) : 8 //向 占内存大的靠齐
sizeof(stu4) : 16
Press any key to continue

#include <stdio.h>
#pragma pack (1) /*指定按1字节对齐*/
typedef union stu1{    
  char str[10];
  int b;
}stu1;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
typedef union stu2{    
  char str[10];
  int b;
}stu2;
void main()
{
  printf("sizeof(stu1) :\t%d\n",sizeof(stu1)); 
  printf("sizeof(stu2) :\t%d\n",sizeof(stu2)); 
}

sizeof(stu1) : 10
sizeof(stu2) : 12
Press any key to continue
怎么回事?
由于之前我们一直都在使用struct,所以在这里我们特地例举了一个union的代码来分析下,我们大家都知道union的大小取决于它所有的成员中占用空间最大的一个成员的大小。由于在union stu1中我们使用了1字节对齐,所以对于stu1来说占用空间最大的是char str[10]类型的数组,,其值为10。为什么stu1为10而stu2却是12呢?因为在stu2的上面我们使用了#pragma pack () ,取消指定对齐,恢复缺省对齐。所以由于stu2其中int类型成员的存在,使stu2的对齐方式变成4字节对齐,也就是说,stu2的大小必须在4的对界上,换句话说就是stu2的大小要是4的整数倍,所以占用的空间变成了12




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值