当访问已对齐的数据时,CPU的执行效率才最高。把数据的地址模除数据的大小,如果结果为0,那么数据就是对齐的。例如:一个WORD值的起始地址应该能被2整除,一个DWORD的起始地址应该能被4整除,以此类推。 下面的代码访问了一个错位的数据 VOID SomeFunc(PVOID pvDataBuffer) { //the first byte in the buffer is some byte of information char c = * (PBYTE) pvDataBuffer; //increase past the first byte in the buffer pvDataBuffer = (PVOID) ((PBYTE)pvDataBuffer + 1); //bytes 2 - 5 contain a double-word value DWORD dw = * (DWORD * ) pvDataBuffer; //the line above raise a data misalignment exception on some CPUS } CPU处理数据对齐的方式 : x86: x86 CPU的EFLAGE寄存器内有一个AC标志。默认为0。如果为0,那么CPU会自动执行必要的操作来访问必要的数据,否则CPU就会触发INT 17H中断 。由于 x86 CPU从来不改变这个标志,因此应用程序在X86 运行时从来不会发生数据错位异常。当应用程序在AMD x86-64处理器上运行时,会有相同的结果。这是因为在默认情况下CPU处理了数据错位的错误。 IA-64: IA-64 CPU不能自动处理数据错位的错误。当任何代码要访问错位数据时,CPU会通知操作系统。Windows然后决定到底是应该抛出数据错位异常,还是应该没有任何提示的执行额外指令来修正错误并让代码继续执行。在IA-64操作系统里,window会自动将将数据错位错误转化成一个EXCEPTION_DATATYPE_MISALIGNMENT异常。但是我们可以通过SetErrorMode来改变这种行为。注意改变这个标志会影响到进程所有的线程,另外值得注意的一点是这个标志会被子进程继承。IA-64版本的vc++ 编译器支持一个__unaligned关键字。下面的代码是前面的代码经过修改代码的版本。新版使用了__unaligned关键字 DWORD dw = * (__unaligned DWORD * ) pvDataBuffer;