對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。需要位元組對齊的根本原因在於CPU訪問資料的效率問題。假設上面整型變數的地址不是自然對齊,比如為0x00000002,則CPU如果取它的值的話需要訪問兩次記憶體,第一次取從0x00000002-0x00000003的一個short,第二次取從0x00000004-0x00000005的一個short然後組合得到所要的資料,如果變數在0x00000003地址上的話則要訪問三次記憶體,第一次為char,第二次為short,第三次為char,然後組合得到整型資料。而如果變數在自然對齊位置上,則只要一次就可以取出資料。一些系統對對齊要求非常嚴格,比如sparc系統,如果取未對齊的資料會發生錯誤,舉個例:char ch[8];char *p = &ch[1];int i = *(int *)p;執行時會報segment error,而在x86上就不會出現錯誤,只是效率下降。
對齊跟資料在記憶體中的位置有關。如果一個變數的記憶體地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。需要位元組對齊的根本原因在於CPU訪問資料的效率問題。假設上面整型變數的地址不是自然對齊,比如為0x00000002,則CPU如果取它的值的話需要訪問兩次記憶體,第一次取從0x00000002-0x00000003的一個short,第二次取從0x00000004-0x00000005的一個short然後組合得到所要的資料,如果變數在0x00000003地址上的話則要訪問三次記憶體,第一次為char,第二次為short,第三次為char,然後組合得到整型資料。而如果變數在自然對齊位置上,則只要一次就可以取出資料。一些系統對對齊要求非常嚴格,比如sparc系統,如果取未對齊的資料會發生錯誤,舉個例:char ch[8];char *p = &ch[1];int i = *(int *)p;執行時會報segment error,而在x86上就不會出現錯誤,只是效率下降。