ü
字节对齐定义
指令对操作数起始地址有特定的要求:
1)单字节对齐:单字节类型数据,可从任意地址取操作数
2)2字节对齐:2字节类型数据,希望从偶地址开始取操作数
3)4字节对齐:4字节类型数据,希望从能被4整除的地址开始取操作数
符合上面要求的,称为对齐的存储访问,访问结果正确;
反之称为非对齐的访问,访问结果将因CPU类型而异.
ü
字节对齐要求与
CPU
的架构类型紧密相关
•
PowerPC
和
X86
:硬件处理
1)对齐没有特殊要求,无论字节对齐与否,数据读取都不会异常
2)在非四字节对齐情况下,数据读取由CPU自动完成多次操作,处理效率会略微下降,对上层应用透明
•
MIPS
和
ARM
:软件处理
1) 对基本数据类型强制要求对齐访问,否则出错
2) 对于数据结构非对齐内存访问可能会异常。可以通过编译选项(如-funaligned-pointers)等软件方法进行处理
ü
字节对齐要求与编译环境也紧密相关
•
ANSI C
对于字节对齐方式没有规定
,
为编译器实现时提供了灵活性
•
对于不对齐的结构类型,不同编译器分配空间,对齐方式可能不一样
例1:
#pragma pack(4)
typedef struct
{
UINT16 usT1;
UINT8 ucT2;
UINT8 ucT3;
UINT8 ucT4;
}TEST_STRU;
#pragma pack(0)
在IXP2350上Tornado编译器分配6字节,Intel 80X86的VC编译器上分配8字节。