C x86 內存對齊 結構體大小計算

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計算:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章