我們現在使用的算機中記憶體空間都是按照位元組(byte)劃分的,理論上說,似乎對任何型別的變數的訪問可以從任意位址開 始,但實際情況則是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別的資料按照一定的規則在記憶體 空間上排列,而不是順序的乙個接乙個地排放,這就是對齊。
1. 第⼀個成員在與結構體變數偏移量為0的位址處。
2. 其他成員變數要對⻬到某個數字(對⻬數)的整數倍的位址處。對⻬數 = 編譯器默 的⼀個對⻬數 與 該成員⼤⼩的較⼩ 值。 vs中預設的值為8 linux中的預設值為4
3. 結構體總⼤⼩為最⼤對⻬數(每個成員變數都有⼀個對⻬數的整數倍。
4. 如果巢狀了結構體的情況,巢狀的結構體對⻬到⾃⼰的最⼤對⻬數的整數倍處,結構體的整體大小就是所有對⻬數最大值 ( 含巢狀結構體的對⻬數的整數倍。
5.如果巢狀了聯合體,將聯合看成乙個普通成員,這個成員的大小就是聯合體的大小。這個成員的對齊數就是聯合體的大小 和預設對齊數的較小值。
1、使用平台的原因:不是在所有平台上都可以訪問任意記憶體的位址,所以需要適當的進行偏移,偏移到我們可以訪問的位置 上進行資料儲存。
2、記憶體對齊可以使訪問速度提高:為了訪問未對齊的記憶體,處理器需要兩次記憶體訪問;然而,對齊的記憶體訪問僅需要一次訪 問
linux 預設#pragma pack(4)
window 預設#pragma pack(8)
注:可以通過預編譯命令#pragma pack(n) ,n=1,2,4,8,16來改變這一係數,其中的n就是指定的「對齊係數」。
struct a
;union c
;struct b
;int main()
windows 上面跑 預設對齊數為8 結果為 24 48
#define offsetof(type, member) ((size_t)(&((type *)0)->member))
type就是結構體名字,member是結構體成員變數名
((type*)0):將0強轉為結構體型別的指標
((type*)0)->member : 結構體指標指向成員變數,得到成員變數
因為結構體指標是0位址處,所以得到的成員的位址就是相對於0位址處的偏移量。
結構體內存對齊
結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...
結構體內存對齊
一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...
結構體內存對齊
對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...