C语言字节对齐

结构体可以使用运算符sizeof进行计算其所占的字节空间。
数据对齐是指在处理结构体中的成员时,成员在内存中的起始地址编码必须是成员类型所占字节数的整数倍。
结构体成员采用数据对齐主要是为了加快读取数据的速度,减少指令周期,使程序运行的更快。
规则:结构体sizeof的计算结果必须是结构体中占用空间最多的成员所占空间的整数倍。
如果结构体中的成员包括数组或者其他结构体,在数据对齐时,要以结构体中最深层的基本数据类型为准。

struct s1{
		int a;
};
struct s2{
		char a[4];
};
struct s3{
		char a[4];
		char b;
};
struct s4{
		s1 a;
		char b;
};
struct s5{
		s2 a;
		char b;
};

结果:

sizeof(struct s1) = 4;
sizeof(struct s2) = 4;
sizeof(struct s3) = 5;
sizeof(struct s4) = 8;
sizeof(struct s5) = 5;

以任意字节进行字节对齐
使用伪指令:#pragma pack(n) C编译器将按照n个字节对齐。
使用伪指令:#pragma pack(),取消自定义对齐方式

#pragma pack(1)

struct test{
		char c;
		short s1;
		short s2;
		int i;
};

上述代码中将对齐方式设为1,因此sizeof(test) = 1+2+2+4=9;

struct test{
		char c;
		short s1;
		short s2;
		int i;
};

如果取消对齐方式,则编译器默认对齐方式为8,sizeof(test) = 1+1(补齐)+2+2+2(补齐)+4=12.

字节对齐的作用不仅是便于CPU的访问,同时合理的利用字节对齐可以有效地节省存储空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值