什麼是位元組對齊,為什麼要對齊

時間 2021-05-31 04:58:55

1樓:Fun Lee

首先要知道我們現代計算機的記憶體空間是按照位元組(byte)來劃分的,然後位元組對齊的意思是說我們在給特定變數型別分配記憶體空間的時候,變數的記憶體位址要是它本身變數型別大小的整數倍。比如說,我給int型別的變數a分配位址空間,因為int型別大小為4位元組,所以它的記憶體位址一定也要是4的整數倍。那如何做到記憶體位址是4的整數倍的?

我們知道,記憶體位址一般是可以用二進位制表示的,在這個例子裡我們只需要把這個二進位制數字最後的四位數都設為0就可以了。

那為什麼要這樣設計呢?

一方面是因為我們的計算機硬體就是這麼設計的,也就是說CPU在訪問儲存器的時候只能在某些位址處獲取某些特定型別的資料。另一方面,因為CPU讀取資料的時候不是乙個乙個讀的,幾個幾個讀的。如果資料不按照一定的規則儲存的話,會降低讀取速度,從而影響計算效率。

2樓:中二青年

第乙個原因——很多CPU只從對齊的位址開始載入資料,而有的CPU這樣做,只是更快一點。

第二個原因——外部匯流排從記憶體一次獲取的資料往往不是1byte,而是4bytes或許8bytes,或者更多~~

這意味著CPU不是一次僅僅抓取乙個byte,而是很4個或者8個byte。

這樣的話,假設你請求2到3bytes的內容,其實CPU一次抓取了4或8byte的內容。

這兩個原因和起來的話,就很明顯了。

假如說你要獲取8byte從9開始,這個時候問題就來了。

CPU必須從8開始獲取8bytes的內容,然後再從16開始,再獲取8Byte的內容。

而如果你是從8開始的話,只需要從8開始獲取8bytes的內容即可。

這裡有兩個結構體,你可以體會下他們的區別。

Struct A

Int a;

short b;

int c;

char d;

struct B{

Int a ;

int c;

short b;

char d;

不過現在,也只有寫比較底層的時候,才會考慮這些。

你若寫C的話,這些了解一下是挺好的。

像指令碼語言,這些就很少考慮了。

3樓:邱昊宇

簡單解釋:

書上寫著:不作死就不會死……

小明:請問這本書的第三個字是什麼?

小紅:是個「死」字。

小明:請問這本書的第六筆是什麼?

小紅:……好吧,是「作」的第二筆:豎。

小明:請問這本書的第

三、四、五、六筆構成的是什麼字?

小紅:………………滾

p.s. 實際上,處理器訪問記憶體要比這情況簡單,因為每個字的筆畫數(每個字的位元組數)是固定的。

詳細解釋:

請參見 Data alignment: Straighten up and fly right

jvm位元組碼指令運算元為什麼不對齊?

dwing JVM的位元組碼是完全平台無關的,所以制定了明確的編碼規則,在上世紀大端儲存也占有不少的市場,不像現在幾乎全被小端佔據了,TCP IP的頭結構也是上世紀制定時選擇了大端作為平台無關的規則,因此JVM選擇大端無可厚非.至於對齊,JVM的非定長指令主要是為了讓位元組碼更緊湊,x86 x64指...

為什麼C C 程式語言經常會提到對齊?對齊到底是什麼,為什麼要對齊,對齊有什麼好處?

哲學家 除了其他答案提到的32位或64位對齊以外,還有一種叫cache line 對齊。快取的讀取是一塊塊的,比如每64位元組是一塊。對一些訪問頻繁的資料結構,快取對齊可以保證整個資料結構都在一塊裡,cache miss 的情況下只需要讀一塊。話說回來,這些對齊都是很底層的東西了,不是對效能有極高要...

動態記憶體申請對齊有什麼意義?

張砸鍋 好管理。就像乙個櫃子,如果東西亂七八糟的堆在裡面,想把不用的扔掉,不好找不好扔 就算找出來扔了,它空出來的那個位置想放別的東西,又不見得就遇到乙個剛好大小合適的 想整理一下吧,弄不好所有的東西都得倒騰一遍,真麻煩。改進的辦法就是裝隔板,固定大小的隔板。一格不夠就兩格合併成一格用,即使東西只有...