C x86 内存对齐 结构体大小计算
内存对齐:本质是牺牲空间,换取时间。
一、计算方法
①取pack(n)的值(n=1,2,4,8…),取结构体中类型最大值为m,两者取小者作为外对齐的数值Y,Y=(m<n?m:n);
②将每一个结构体成员的大小与Y比较,取小者作为内对齐的数值Ni;
③内对齐,即从地址能被Ni整除的地方开始存放数据。(设起始地址为0);
④外对齐,依据Y的值(Y的最小整数倍),进行补空操作。
二、案例分析
(1)情况1
#include <stdio.h>
#pragma pack(2)
typedef struct tt
{
char m;
short c;
char b;
}Tt;
typedef struct test
{
char a[5];//数组看成5个char,这里m!=5
short b;
int *c;
Tt t;//结构体不用来获取m的值
}Test;
int main()
{
printf("sizeof(Tt)=%d\n", sizeof(Tt));
printf("sizeof(Test)=%d\n", sizeof(Test));
return 0;
}
(2)结果1
(3)分析1
①结构体Tt计算:
②结构体Test计算:
(1)情况2
#include <stdio.h>
#pragma pack(8)
typedef struct tt
{
char m;
short c;
char b;
}Tt;
typedef struct test
{
char a[5];
short b;
int *c;
Tt t;
}Test;
int main()
{
printf("sizeof(Tt)=%d\n", sizeof(Tt));
printf("sizeof(Test)=%d\n", sizeof(Test));
return 0;
}
(2)结果2
(3)分析2
①结构体Tt计算:
②结构体Test计算: