结构体字节对齐

原则1:数据成员的对齐规则(以最大的类型字节为单位)。

结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)

原则2:结构体作为成员的对齐规则。

如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。

原则3:收尾工作

结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

总结:结构体中成员的首地址必须是该成员类型所占内存的整数倍,并且结构体总的字节数必须是最大成员所占字节数的整数倍。

struct A
{
	char c;//0
	int i;//4-7
	short a;//8-9
	//0-9总共10字节,必须是结构体内部最大成员(int)的整数倍,所以这里取12
	//sizeof(A) = 12
};
struct A
{
	char c;//0
	short a;//2-3
	int i;//4-7
	//0-7总共8字节,必须是结构体内部最大成员(int)的整数倍,所以这里取8
	//sizeof(A) = 8
};
struct A
{
	char c;//0
	short a;//2-3
	double i;//8-15
	char b;//16
	//0-16总共17字节,必须是结构体内部最大成员(double)的整数倍,所以这里取24
	//sizeof(A) = 24
};
struct A
{
	char c;//0
	short a;//2-3
	double i;//8-15
	//0-15总共16字节,必须是结构体内部最大成员(int)的整数倍,所以这里取16
	//sizeof(A) = 16
};

struct B
{
	int a;//0-3
	char b[3];//4-6
	int c;//8-11

	A aa;//A结构体中最大的成员是double,所以从8的整数倍开始存储,即16
		/*A结构体中的元素
		char c;//16
		short a;//17-18
		double i;//24-31
		*/
	//0-31总共32字节,必须是结构体内部最大成员(double)的整数倍,所以这里取32
	//sizeof(B) = 32
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值