記憶體位址對齊方式

2021-06-17 20:38:10 字數 947 閱讀 4223

對齊的作用和原因:各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況, 但是最常見的是如果不按照適合其平台的要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型(假設為 32位)如果存放在偶位址開始的地方,那麼乙個讀週期就可以讀出,而如果存放在奇位址開始的地方,就可能會需要2個讀週期,並對兩次讀出的結果的高低 位元組進行拼湊才能得到該int資料。顯然在讀取效率上下降很多。這也是空間和時間的博弈。

struct a 

;struct b

;struct c

;struct d

;struct e

;

上面的結構體的大小為:

對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,long,型別,其自身對齊值為4,double型別,其自身對齊值為8,單位位元組。

這裡面有四個概念值:

1)資料型別自身的對齊值:就是上面交代的基本資料型別的自身對齊值。

2)指定對齊值:#pragma pack (value)時的指定對齊值value。

3)結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

4)資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的那個值。

有效對齊值n是最終用來決定資料存放位址方式的值,最重要。有效對齊n,就是表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0".而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是 資料結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數占用總長度需要是對結構體有效對齊值的整 數倍)。

記憶體位址對齊

記憶體位址對齊,是一種在計算機記憶體中排列資料 訪問資料的一種方式,包含了兩種相互獨立又相互關聯的部分 基本資料對齊和結構體資料對齊。當今的計算機在計算機記憶體中讀寫資料時都是按字 word 大小塊來進行操作的 在32位系統中,資料匯流排寬度為32,每次能讀取4位元組,位址匯流排寬度為32,因此最大...

記憶體位址的對齊

3 有 pragma pack int 進行設定,如果結構體某成員的sizeof大於你設定的,則按你的設定來對齊 注意 每次用 pragma pack int 進行設定後,要用 pragma pack 對其結束,免得造成錯誤 view plain copy to clipboard print in...

自然對齊(記憶體位址)

c 中 基本資料型別的變數不能簡單的儲存於記憶體中的任意位址,他們的起始位址必須能被他們的大小整除。typedef unsigned char byte enum color struct eigth double m price color m color bool m isshift bool ...