1. 程式人生 > >c++結構體記憶體對齊原理和方法

c++結構體記憶體對齊原理和方法

假設我們同時宣告兩個變數: 
char a; 
short b; 
用&(取地址符號)觀察變數a, 
b的地址的話,我們會發現(以16位CPU為例): 
如果a的地址是0x0000,那麼b的地址將會是0x0002或者是0x0004。 
那麼就出現這樣一個問題:0x0001這個地址沒有被使用,那它幹什麼去了? 答案就是它確實沒被使用。 因為CPU每次都是從以2位元組(16位CPU)或是4位元組(32位CPU)的整數倍的記憶體地址中讀進資料的。如果變數b的地址是0x0001的話,那麼CPU就需要先從0x0000中讀取一個short,取它的高8位放入b的低8位,然後再從0x0002中讀取下一個short,取它的低8位放入b的高8位中,這樣的話,為了獲得b的值,CPU需要進行了兩次讀操作。

但是如果b的地址為0x0002, 那麼CPU只需一次讀操作就可以獲得b的值了。所以編譯器為了優化程式碼,往往會根據變數的大小,將其指定到合適的位置,即稱為記憶體對齊(對變數b做記憶體對齊,a、b之間的記憶體被浪費,a並未多佔記憶體)