位元組對齊的問題

2021-07-22 07:44:36 字數 767 閱讀 8147

位元組對齊的細節和具體編譯器實現相關,表現為具體的彙編翻譯可能會因為編譯器的不同而不同,但一般而言,滿足三個準則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數

倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的位址空間。

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。

例如:

int main()

;int* pi = (int*)&s[1];

*pi = 1;

return 0;

}在keil(m0核心)下編譯後執行,果然在*pi = 1那行丟擲了乙個匯流排錯誤;

必須要求位元組對齊,否則就會出錯

經過測試,如果你的變數是兩位元組的,如short型別,那麼記憶體位址必須能夠被2整除。如果是四位元組變數,那麼記憶體位址必須能夠被4整除,乙個位元組的,如char型,那就無所謂了

一般risc架構都會要求位元組必須對齊,否則就會有問題,但是x86的晶元沒有問題,當記憶體位址不對齊時,晶元會自動分兩次讀取資料,只是影響效率,不會有程式崩潰的危險。

因此,如果是自己定義的類和結構體,盡量顯示的讓它位元組對齊,這樣在跨平台的時候就不會有問題,如:

struct xx;

這個結構體在四位元組對齊的情況下,sizeof(xyz) = 8,如果你定義成:

struct xyz;

占用的空間是一樣的,但是移植起來就方便了。

位元組對齊的問題

為了能使cpu對變數進行高效快速的訪問,變數的起始位址應該具有某些特性,即所謂的 對齊 例如對於4位元組的int型別變數,其起始位址應位於4位元組邊界上,即起始位址能夠被4整除。變數的對齊規則如下 32位系統 type alignment char 在位元組邊界上對齊 short 16 bit 在雙...

位元組對齊的問題

基本概念 位元組對齊 計算機儲存系統中以byte為單位儲存資料,不同資料型別所佔的空間不同,如 整型 int 資料佔4個位元組,字 符型 char 資料佔乙個位元組,短整型 short 資料佔兩個位元組,等等。計算機為了快速的讀寫資料,預設情況下將資料存放在某個位址的起始位置,如 整型資料 int ...

位元組對齊問題

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平台對儲存空間的...