關於位元組對齊的理解

2021-06-25 17:57:43 字數 2101 閱讀 4739

位元組對齊的剖析

一、需要了解的名詞和概念

1、資料型別自身的對齊值:即資料本身所佔位元組長度。

2、結構體或類的自身對齊值:即其中資料成員型別對齊值的最大值。

3、指定對齊值:由程式設計人員通過#pragma pack(value)指定的value值,通過#pragma pack()**解除。

4、結構體、類、資料成員的有效對齊值:即2、3的較大值。

5、圓整: 即結構體成員變數占用總長度需要是對結構體有效對齊值的整數倍

以上為理解位元組對齊的最基本要求,請耐心看完。

二、cpu的指令執行過程

在討論位元組對齊之前先簡單看一下cpu對指令處理讀寫指令的工作過程:首先cpu從pc(程式計數器)中得到指令位址,通過匯流排從記憶體中取出指令(即其操作碼+位址碼),放入ir(指令暫存器)中(pc->ar[位址暫存器]->bus->dr[資料暫存器]->ir)對操作碼進行解碼,得到具體操作,同時pc自增1(下一條指令)。上述過程消耗乙個cpu週期(機器週期)。然後進入下乙個cpu週期,cpu取出其操作物件的位址碼,通過匯流排在記憶體中定位到該位址,再進入下乙個週期,若此時為寫操作,則直接將資料寫入到記憶體位址中,操作結束,若為讀操作,則將資料通過匯流排從記憶體中取到cpu中,然後交由累加器或者其他控制項進行處理完畢。個人認為,cache速度小於暫存器速度,故讀取資料應當耗時更多,但由於計算機由cpu週期控制,在同步時鐘訊號的控制下應當是一樣的,如果非同步控制可能略有差異。

三、位元組對齊的案例和分析

上述介紹看似和字長對齊沒有任何關係,首先是為了讓大家對cpu處理資料讀寫有個全面的認識,其次我們可以知道如果減少資料讀取次數顯然可以提高資料處理效率。

那麼所謂的位元組對齊就是起此作用的,巨集觀上來講,它是通過一次讀取有效對齊值來避免不必要的讀操作,核心思想是使用空間去置換時間。

相信很多人在對結構體使用sizeof運算子(or關鍵字)的時候出現的那種大於其內部元素位元組長度之和的現象很是費解,這其實就是因為位元組對齊的原因,我們來看乙個例子

struct a

int a1;

char a2;

short a3; 

struct b

char b2;

int b1;

short b3; 

intmain()

a a;

b b;

cout

return 0;   

執行結果

注:這裡使用dev進行編譯,如果使用vc會編譯時自動進行優化

分析一下原因:為了使程式更快速的對記憶體中資料進行操作,勢必需要減少訪存時間,顯然只要盡可能多地(貪心思想)取出存放的資料就能達到這一目的,所以在儲存結構體中資料時缺省會按照最大的長度填充字段(不足補空,同時長度受限於系統匯流排長度)。這樣一來,a結構中,int為4位元組,char+short為3位元組,另外補足乙個為空的位元組,共計8位元組(為4位元組(32位)的整數倍)需要訪存2次就能取出資料(執行階段),而b結構體中,預設按照有效對齊值對齊,則char型別所佔空間擴充套件為4位元組,int佔4位元組,short擴充套件為4位元組,共佔12個位元組。

設想一下如果沒有字段對齊,當要取b結構中的第二個int時,將會先取出其前3個位元組然後第二次訪訪問出其最後乙個位元組,顯然效率太低(舉乙個不太恰當的例子,好比用乙個大夾子去夾取一些貨物,如果每次夾取前都要調整夾子的寬度勢必會耽誤時間,也可以模擬一下計算機網路中資料報的封裝,比如tcp/ip協議中的資料報頭都是對齊封裝的,也是為了便於讀取迅速以提高效率)

四、總結

儲存規則:最終的

結構體的總位元組數應當保證為內部資料成員最長位元組數的整數倍,且每個資料成員的儲存起始位址位置為字長的整數倍(即儲存位址%位元組長度=0)

以上就是字段對齊的過程和意義,需要注意的是有些比較嚴格的機器會有一些字段對齊相關的錯誤隱患,比如部分機器要求首位址均從偶數開始(因為資料所佔位元組數均為2的指數冪),如果從奇數邊界去訪問資料變數就可能出現報錯。

人類對cpu資源蠻橫無理的榨取就如同當年資本主義剝削無產階級每一分勞動剩餘價值一樣殘酷,但是這種「殘酷」卻將使人類文明不斷向前邁進。

關於位元組對齊的理解

結構體對齊 有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 struct t 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實 踐出真知,在vc6中測試了下...

關於位元組對齊

用乙個例子簡單說明一下 v6環境 輸出結果 char 1 long 4 s1 8 s2 16 結果分析 棧由高向低增長,小端位元組序 addr s1.l 0x12ff7c addr s1.s 0x12ff78 addr s1 0x12ff78 addr s2.l 0x12ff74 addr s2.t...

關於位元組對齊

位元組 byte 是計算機資訊技術用於計量儲存容量和傳輸容量的一種計量單位,乙個位元組等於8位 二進位制數 在utf 8編碼中,乙個英文 字元等於乙個位元組。位元組按照一定規則在空間上排列就是位元組對齊。需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為...