位元組對齊的問題

2021-08-25 18:55:34 字數 1140 閱讀 8316

. 基本概念

位元組對齊:計算機儲存系統中以byte為單位儲存資料,不同資料型別所佔的空間不同,如:整型(int)資料佔4個位元組,字 符型(char)資料佔乙個位元組,短整型(short)資料佔兩個位元組,等等。計算機為了快速的讀寫資料,預設情況下將資料存放在某個位址的起始位置, 如:整型資料(int)預設儲存在位址能被4整除的起始位置,字元型資料(char)可以存放在任何位址位置(被1整除),短整型(short)資料儲存 在位址能被2整除的起始位置。這就是預設位元組對齊方式。

2. 舉例說明

很顯然預設對齊方式會浪費很多空間,例如如下結構:

struct student

本 來只用了11bytes(5+4+2)的空間,但是由於int型預設4位元組對齊,存放在位址能被4整除的起始位置,即:如果name[5]從0開始存放, 它佔5bytes,而num則從第8(偏移量)個位元組開始存放。所以sizeof(student)=16。於是中間空出幾個位元組閒置著。但這樣便於計算 機快速讀寫資料,是一種以空間換取時間的方式。其資料對齊如下圖:

|char|char|char|char|

|char|----|----|----|

|--------int--------|

|--short--|----|----|

如果我們將結構體中變數的順序改變為:

struct student

則,num從0開始存放,而name從第4(偏移量)個位元組開始存放,連續5個位元組,score從第10(偏移量)開始存放,故 sizeof(student)=12。其資料對齊如下圖:

|--------int--------|

|char|char|char|char|

|char|----|--short--|

如果我們將結構體中變數的順序再次改為為:

struct student

則,sizeof(student)=12。其資料對齊如下圖:

|--------int--------|

|--short--|char|char|

|char|char|char|----|

ps:sizeof只是計算分配在棧上的空間,比如在結構體上的static成員變數是不計算在其內空間的

位元組對齊的問題

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

位元組對齊的問題

位元組對齊的細節和具體編譯器實現相關,表現為具體的彙編翻譯可能會因為編譯器的不同而不同,但一般而言,滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數 倍,如有需要編譯器會在成員之間加上填充位元組 例如上面第二個結...

位元組對齊問題

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