ü
位元組對齊定義
指令對運算元起始位址有特定的要求:
1)單位元組對齊
:單位元組型別資料
,可從任意位址取運算元
2)2位元組對齊
:2位元組型別資料
,希望從偶位址開始取運算元
3)4位元組對齊
:4位元組型別資料
,希望從能被4整除的位址開始取運算元
符合上面要求的
,稱為對齊的儲存訪問
,訪問結果正確;
反之稱為非對齊的訪問
,訪問結果將因
cpu型別而異.
ü位元組對齊要求與
cpu的架構型別緊密相關 •
powerpc
和x86
:硬體處理 1)
對齊沒有特殊要求,無論位元組對齊與否,資料讀取都不會異常 2)
在非四位元組對齊情況下,資料讀取由
cpu自動完成多次操作,處理效率會略微下降,對上層應用透明 •
mips
和arm
:軟體處理
1) 對基本資料型別強制要求對齊訪問,否則出錯
2) 對於資料結構非對齊記憶體訪問可能會異常。可以通過編譯選項(如
-funaligned
-pointers
)等軟體方法進行處理
ü 位元組對齊要求與編譯環境也緊密相關
• ansi c
對於位元組對齊方式沒有規定
,為編譯器實現時提供了靈活性 •
對於不對齊的結構型別,不同編譯器分配空間,對齊方式可能不一樣 例
1: #
pragma
pack(4)
typedef
struct
test_stru; #
pragma
pack(0) 在
ixp2350
上tornado
編譯器分配
6位元組,
intel 80x86的vc
編譯器上分配
8位元組。
CPU訪問位元組對齊
編寫可移植 需要考慮的乙個問題是如何訪問不對齊的資料。例如,如何讀取乙個儲存於乙個不是 4 位元組倍數的位址的4位元組值.i386 使用者常常訪問不對齊資料項,但是不是所有的體系允許這個,很多現代的cpu體系會產生異常。可以採用以下的函式,進行位元組對齊。include get unaligned ...
mysql位元組對齊 位元組對齊會影響記憶體訪問的效率嗎
由於c 的專案做的少,又比較小,所以一直沒有注意位元組對齊的問題,但是,位元組對齊在大規模應用中對記憶體管理和cpu執行效率的影響應是挺大的。本文根據一些資料學習,做乙個小總結。cpu執行指令時從記憶體中獲取資料是按塊操作的,塊的大小可能為2 bytes,4 bytes,8 bytes,16 byt...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...