計算機的位元組順序模式分為大端資料模式和小端資料模式,它們是根據資料在記憶體中的儲存方式來區分的。其中,大端和小端和計算機的字長沒有關係,而是固有的特性。
舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:
(1)大端模式(正序):
低位址 -----------------> 高位址
0x12 | 0x34 | 0x56 | 0x78
(2)小端模式(逆序):
低位址 ------------------> 高位址
0x78 | 0x56 | 0x34 | 0x12
(3)下面是兩個具體例子:
記憶體位址
小端模式存放內容
大端模式存放內容
0x4000
0x34
0x12
0x4001
0x12
0x34
32bit寬的數0x12345678在little-endian模式以及big-endian模式)cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:
記憶體位址
小端模式存放內容
大端模式存放內容
0x4000
0x78
0x12
0x4001
0x56
0x34
0x4002
0x34
0x56
0x4003
0x12
0x78
記憶體對齊,也叫邊界對齊(boundary alignment),是處理器為了提高處理效能而對訪問資料的起始位址所提出的一種要求。編譯器為了使我們編寫的c程式更有效,就必須最大限度地滿足處理器對邊界對齊的要求。
要求如下,即對於存放某長度為 m 位元組的資料,存放首位址需為 m 位元組的整數倍,同時,結構體整體的大小是最大成員長度的整數倍。
從處理器的角度來看,需要盡可能減少對記憶體的訪問次數以實現對資料結構進行更加高效的操作。為什麼呢?因為儘管處理器包含了快取,但它在處理資料時還得讀取快取中的資料,讀取快取的次數當然是越少越好!
如上圖所示,在採用邊界對齊的情況下,當處理器需要訪問 a_ 變數和 b_ 變數時都只需進行一次訪問(圖中花括號表示一次訪問操作)。若不採用邊界對齊,a_ 變數只要一次處理器操作,而 b_ 變數卻至少要進行兩次操作。對於 b_,處理器還得呼叫更多指令將其合成乙個完整的 4 位元組,這樣無疑大大降低了程式效率。
結構體內存對齊和大小端
結構體怎麼對齊?1.第乙個成員與結構體變數偏移量為0的位址處開始數 2.其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處 注意 對齊數,vs中是8,linux中是4 3.結構體的總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的整數倍 4.如果巢狀了結構體的情況,巢狀的結構體對齊...
關於大小端序和位元組對齊的總結
在使用變數的時候,直接對變數進行操作,無需管是大端還是小端序,但是 以位元組為單位進行操作時就需要考慮 比如 int numports numports 1 這樣子numports的值就是1了 如果這樣 unsigned char s unsigned char numports,然後再對s進行操作...
大小端模式和網路位元組序
概念 在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列。例如在c語言中,乙個型別為int的變數x位址為0x100,那麼其對應位址表示式 x的值為0x100。且x的四個位元組將被儲存在儲存器的0x100,0x101,0x102,0x103位置。大端位元組序 在記憶體中,低位址存放資料的高位,...