浅谈字节对齐

    知识忘记的速度真的是快,总是感觉自己好像什么都没学过,于是开始复习一下知识,今天复习了一下C语言中的字节对齐。

现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量。但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序一个接一个地存放,这就是对齐。

   我对字节对齐的理解是:字节对齐的作用是提高访问效率,不同的平台有不同的数据对齐方式,如果不按照平台要求对数据存放进行对齐,会带来存取效率上的损失。比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。

   讨论字节对齐的时候需要注意以下四条规律:

1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。

      2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
      3) 指定对齐值:#pragma pack (value)时的指定对齐值value。
      4) 数据成员,结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。

我们可以根据这四条规则去推敲各种情况下的字节对齐方式,并求出结构体所占的字节数,一般字节对齐在C语言中主要是出现在结构体中,其他的情况比较简单。
我个人认为需要注意的有如下:
1. 不同平台默认的对齐方式不同,Linux下是4,windows下是8
2. 以下两种情况的对比需要注意一下
struct AA{
	char a;
	int b;
	struct {
		char c;
		int  d;
	};
	double e;
};
sizeof(AA)


struct AA{
	char a;
	int b;
	struct BB{
		char c;
		int  d;
	};
	double e;
};
sizeof(AA)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值