現代計算機中記憶體空間都是按照位元組~(byte)~劃分的。從理論上講似乎對記憶體的訪問可以從任何位址開始,但現實是儲存在某些特別位址上的資料需要多次訪問,
經過特殊處理後才能訪問到。為了提高訪問速度,需要資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是位元組對齊~(byte alignment)。
各個硬體平台對儲存空間的處理是不同的。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如~arm~要求訪問記憶體的位址必須是~4~位元組對齊的,arm~的
資料匯流排是~32bit。假設訪問乙個~4~字對齊的~32bit~整型變數,只需要一次讀操作,即可完成讀取;如果訪問乙個非對齊的~32bit~整型變數,arm~須將含有這個變數
的高位元組按對齊方式讀取出來,然後再將低位元組按對齊方式讀取出來,再把兩次結果拼在一起得到這個整型變數。顯然在訪問效率上,非對齊的變數訪問差很多。不是所有
系統都需要位元組對齊,如~80c51~類似的~8~位微控制器,本身就是按乙個位元組對齊的,就不存在這樣的問題。x86~的硬體可以處理位址未對齊的問題,
位元組對齊對於一般的~x86~程式,不是那麼重要。
編譯器為了增加結構體等資料的訪問速度,它會使用一定的方法對齊資料成員。如下列~c/c++~**:
如果不考慮對齊因素,結構體~ta、tb~和~tc~的尺寸是一致的,占用~7~個位元組。事實上,編譯器編譯後,
這三個結構體的尺寸是不一致的,ta~占用~8~個位元組;tb~占用~12~個位元組;tc~占用~7~個位元組。先了解以下四個概念:
1.資料型別自身的對齊值:基本資料型別的自身對齊值,char~型資料,
其自身對齊值為~1~位元組,short~型為~2~位元組,對於~int、long、float、double~型別,
為~4~位元組,long long~型別為~8~位元組;
2.指定對齊值:#pragma pack (value)時的指定對齊值~value;
3.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。
4.資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的值。
有效對齊值是最終用來決定資料存放位址方式的值。資料結構中的資料變數都是按定義的先後順序來儲存的,
第乙個資料變數的起始位址就是資料結構的起始位址,內部成員變數存放位址都要按照有效對齊值對齊,
結構體成員變數占用位元組數也需要是結構體有效對齊值的整數倍。
假設~ta~從位址~0x0~開始存放,a~位址是~0x0,占用~4~個位元組;b~位址從~0x4~開始,占用~1~個位元組;c~位址需要
按~2~對齊,故從~0x6~開始,占用~2~個位元組;總體共占用~8~個位元組,正好是結構體自身對齊值~4~的倍數。故~ta~
最終占用~8~個位元組。假設~tb~也從~0x0~開始存放,b~位址是~0x0,占用~1~個位元組;a~位址需要按~4~位元組對齊,
故從~0x4~開始,占用~4~位元組;c~位址需要按~2~位元組對齊,當前位址~0x8~正好是對齊的,占用兩個位元組;總體共占用
~10~個位元組,但是~10~不是本結構體自身對齊值~4~的整倍倍數,故對齊後最終占用~12~個位元組。同理不難得出,tc~占用
~7~個位元組。
從討論來看,對齊問題屬於乙個空間和時間平衡的問題,在設計嵌入式系統時,位元組對齊是乙個必須考慮的問題。
為了避免空間的浪費,又要提高**的執行速度時,要手工調整一些設計細節。尤其是協議類的**,為了避免出現位元組空洞,
協議的報文往往是按照~1~個位元組對齊,極易出現非對齊位址,設計上應盡可能避免。
作業系統 作業系統的概念
3 作業系統的目標和功能 作業系統用做擴充機器 計算機系統自上而下可區分為 從作業系統的角度 計算機系統的概述 在計算機中的cpu 記憶體 輸入 輸出裝置等硬體,提供了基本的計算機資源 應用程式等規定了按何種方式來使用這些資源來為使用者服務 作業系統控制和協調各使用者程式對硬體的分配和呼叫。所以作業...
基礎概念 位元組對齊
為什麼要位元組對齊?位元組對齊實際上是犧牲空間換取時間的行為 為了解決cpu訪問資料的效率問題 cpu訪問資料都會讀取固定字長的資料,例如32位cpu,一次性會讀取32bit的資料 例如 第一次會讀取0x0000,0x0001,0x0002,0x0003 這四個位址空間內的資料 每個位址存著1位元組...
作業系統相關概念
作業系統相關概念 windows windows中文是窗戶的意思。另外還有微軟公司 推出的視窗 電腦作業系統名為windows 隨著電腦硬體和軟體系統的不斷公升級,微軟的windows作業系統也在不斷公升級,從16位 32位到64位 作業系統。從最初的windows1.0到大家熟知的windows9...