C x86 内存对齐 结构体大小计算

C x86 内存对齐 结构体大小计算

内存对齐:本质是牺牲空间,换取时间。

一、计算方法

①取pack(n)的值(n=1,2,4,8…),取结构体中类型最大值为m,两者取小者作为外对齐的数值Y,Y=(m ②将每一个结构体成员的大小与Y比较,取小者作为内对齐的数值Ni;
③内对齐,即从地址能被Ni整除的地方开始存放数据。(设起始地址为0);
④外对齐,依据Y的值(Y的最小整数倍),进行补空操作。

二、案例分析

(1)情况1
#include 
#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

C x86 内存对齐 结构体大小计算_第1张图片

(3)分析1

①结构体Tt计算:
C x86 内存对齐 结构体大小计算_第2张图片
②结构体Test计算:
C x86 内存对齐 结构体大小计算_第3张图片

(1)情况2
#include 
#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

C x86 内存对齐 结构体大小计算_第4张图片

(3)分析2

①结构体Tt计算:
C x86 内存对齐 结构体大小计算_第5张图片
②结构体Test计算:
C x86 内存对齐 结构体大小计算_第6张图片

你可能感兴趣的:(C++)