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計算: