C语言结构体-内存对齐原则

补充:可以使用简单地从大到小排列成员,以取得最小地空间浪费(最大成员在先)。

——————————————————————

原则:

1,结构体中的第一个变量的起始地址为0,其余变量的内存其实位置为Min(#pragma pack(n),sizeof(这个变量))的整数倍。

2,如果有嵌套结构体,那么只需要将嵌套的结构体当作是普通变量即可。

3,最终sizeof 结构体的结果是所有对齐变量Min(#pragma pack(n),sizeof(这个变量))的整数倍。
注:VS编译器默认对齐(#pragma pack(n))的数值是linux下默认是4

例子:

//sizeof(s1)都是 16
struct  s1
{
	char a;
	double b;
};

分析:

 代码

struct s2//sizeof(s2) 是 16
{
	char a;
	int b;
	double c;
};

分析:

 代码:

struct s3//sizeof(s3) 是 24
{
	char a;
	double b;
	int c;
};

分析:C变量后面额外的四字节内存是为了符合最终结构体长度必须是 (在本例中前提下

8-->(b的对齐值)和4-->(c的对齐值)的整数倍。

代码:

struct s4  //sizeof s4 是 32
{
	char a;
	struct s2 s;
	/*{
		char a;
		int b;
		double c;
	}*/
	int b;
};

分析:首先分析内嵌结构体s2:

那么此时分析结构体s4:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值