當通路已對齊的資料時,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;