参考:http://blog.csdn.net/RadianceBlau/article/details/60867307
#include<stdio.h>
int main(){typedef struct A{
char b;
int c;
double d;
char a;
}a;
typedef struct B{
char a;
char b;
int c;
double d;
}b;
printf("%d%d%.2f",sizeof(a),sizeof(b),sizeof(a)/sizeof(b));
}
输出 24 16 0.00 (我的电脑是64位)
结构体:涉及内存对齐以提高内存的利用率,位段的使用。
因为32位机器的内存是以4字节对齐的 所以第一个就是4 8 8 4
第二个就是两个char4个字节 4 4 4 4
约定为32位系统,即char 1字节、short 2字节、int 4字节
该问题总结为两条规律:
1,每个结构体成员的起始地址为该成员大小的整数倍,即int型成员的其实地址只能为0、4、8等
2,结构体的大小为其中最大成员大小的整数倍
- struct A{
- char a; //1
- int b; //空3 + 4 = 7 (规则1)
- short c; //2+空2=4 (规则2)
- }; 输出12
- struct B{
- char a; //1
- short b; //空1 + 2 = 3 (规则1)
- int c; //4
- }; 输出8
上面是问题的简化版,其实还有另外两条规则,下面严格按照定义补充完整:
1,数据类型自身对齐
数据类型的起始地址为其大小的整数倍
2,结构体的自身对齐
结构体的自身对齐值为其中最大的成员大小
3,指定对齐
可以使用关键词#pragma pack(1) 来指定结构体的对齐值
4,有效对齐值
有效对齐值为自身对齐值与指定对齐值中较小的一个。(即指定对齐值超过自身对齐值无意义)
- #pragma pack(1)
- struct A{
- char a;
- int b;
- short c;
- }; 输出7
- #pragma pack(1)
- struct B{
- char a;
- short b;
- int c;
- }; 输出7
这个结果比较容易理解,struct成为了紧密型排列,之间没有空隙了。
- #pragma pack(8)
- struct A{
- char a;
- int b;
- short c;
- }; 输出12
- #pragma pack(8)
- struct B{
- char a;
- short b;
- int c;
- }; 输出8