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