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计算:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值