c语言内存对齐问题
#include <stdio.h>
#pragma pack(4)
struct stu
{
char a;
short b;
int c;
char d;
};
int main()
{
printf("%d\n", sizeof(struct stu));
return 0;
}
#pragma pack(4) // pack(n) n=2^n
windows默认值8 linux 默认值是4
在c语言中struct结构体中存储对齐有几个重要条件:
1、每个成员按其类型的方式对齐,char的对齐值为1,short对齐值为2,int为4 ----单位字节
2、struct长度必须是成员中最大的对齐值的整数倍(不够就补空字节),以便在处理数据时保证每一项都边界对齐
注:除了以上两条,还要考虑编译器中字节对齐的大小
/*
1、取pack(n) n=4 ,
取结构体中最大的成员数据类型(在这个结构体中字节数最大的数据类型int)即m=4
取小得 k= (m<n ? m:n) ,k=4即为外对齐的原则
2、取结构体成员中的每个元素类型大小x,同k比
(x)依次取小,作为内存对齐的原则,
3、所谓的对齐,即假设起始地址为0,能被x整除者即为对齐。
*/
根据上面的算法:在Linux默认值为4,n=4,m=4;得到结果k也等于4,每个结构体成员对应的x的大小分别为:1,2,4,1
假设结构体起始地址为0,结果如图所示,略丑,请见谅: