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

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

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 typedefstructstu1{char array[7];

}stu1;

typedefstructstu2{doublefa;

}stu2;

typedefstructstu3{

stu1 s;charstr;

}stu3;

typedefstructstu4{

stu2 s;charstr;

}stu4;voidmain()

{

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

#pragma pack (1) /*指定按1字节对齐*/typedef union stu1{char str[10];intb;

}stu1;#pragma pack () /*取消指定对齐,恢复缺省对齐*/typedef union stu2{char str[10];intb;

}stu2;voidmain()

{

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、付费专栏及课程。

余额充值