理解数据对齐

数据对齐是由于CPU内存访问特性和不同数据类型的大小导致的问题,主要影响性能和数据传输。编译器通常会自动进行数据对齐,但在网络通讯等场景下可能需要手动调整以避免错误。例如,VC6.0中未对齐的数据结构在解码IP选项时会导致错误的结果,通过#pragma pack可以强制设置对齐方式来解决问题。
摘要由CSDN通过智能技术生成
  为什么会产生数据对齐问题
 
8位CPU 当然不会产生数据对齐问题,当CPU发展到16,32位时,因为CPU的一次内存访问就能取回4个byte(且用32位举例,这个数据理所当然的缓存在相应的32位寄存器中)——里面可能存储了4个1byte的数据,也可能存储了2个2byte的数据……,所以CPU在逻辑上将内存单元寻址地址边界设置为4的倍数(如:0,4,8,12……),这是数据对齐产生的必要条件之一;另一个原因是程序中使用的数据类型并非都是4的倍数,如:char(1byte),short(2byte),int(4byte)等等。让我们考虑一下一个2byte的的变量在内存单元中排布吧:如果这个变量地址为0或1或2,那么CPU一次内存访问就能够取得你的变量;但如果是3的话,很不幸,CPU还得访问一次内存以取得全部数据。
 
  何时考虑 数据对齐
  在程序对性能属性要求严格的情况下,数据对齐是硬件平台需要考虑的问题,它能提高CPU内存的访问速度。现在的大多数编译器会默认对齐程序中用到的数据,所以程序员一般不需要考虑这些问题。但编译器的擅作主张也未必都是一件好事,譬如网络程序为减少通讯的数据量而传输未经对齐的数据,这时对于接收端就不应该做数据的对齐(下面将要举例),这一点需要格外注意。

  举个例子
 
这个例子是VC6.0下数据对齐问题中的一个:
 
 
   typedef struct _ipoptionhdr
{
    unsigned 
char        code;        // Option type
    unsigned char        len;           // Length of option hdr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值