原因:
結構體內存對齊是因為,對於計算機來說讀取4個位元組的記憶體空間比讀取1、2、3個位元組的要更高效。但是也根據編譯器而定,而且自己也可以改變對齊記憶體的大小用 預編譯命令#pragma pack (n)
規則:1.第乙個元素offset偏移到位址為0的記憶體上。
2.之後的元素對齊到對齊數大小的整數倍的偏移量上。
何為對齊數:對齊係數和元素大小的較小值,每個成員變數除了第乙個成員都有對齊數
3.結構體整體物件的大小必須是最大對齊數的整數倍。
4.結構體內含有結構體也按該結構體的大小計算對齊數。
#include using namespace std;
struct a ; // 12
struct b ; // 2
struct c ; // 2
// 這塊要注意了,是對於最大對齊數的整數倍,雖然結構體a大小是12,但是12和對齊係數相比較,對齊係數4較小,這個結構體的對齊數為4
struct d ; // 24
struct e ;
// 而且對齊係數的預編譯作用範圍在該命令之後,之前的資料並不影響
#pragma pack (2)
struct f ;
// 這裡也要注意,還是對齊數的問題,char是1,對齊係數是2,應該用1對齊,故還是三是1的倍數。
struct g ;
#pragma pack (4)
// 指標變數的大小是4
// 而且這裡太有趣了,記憶體對齊只在預編譯之後進行,甚至可以放在結構體內部進行,說明結構體的記憶體申請不是都讀取完再申請,而是按順序執行再申請
大家同時也可以看到,在結構體中的元素裡後面加冒號的情況,這代表位域。表示我讓某個元素一定要占有多少位。也可以不寫變數名,只寫變數的位域,表示這段空間不存內容但是要空閒出來。
struct結構體的記憶體對齊
1 結構體中第乙個成員在 與結構體變數偏移量為0 的位置 2 其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處 注意 1 對齊數 編譯器預設的乙個對齊數 與 該成員所佔空間的位元組數 的較小值 2 vs中預設的對其數是8,linux中的預設值為4。3 成員對其後,結構體自身也要對齊。結構體的總...
C語言 結構體struct 結構體對齊
1 定義乙個結構體 順便例項結構體變數 struct tag 結構體型別名 struct tag 這兩者共同構成了結構體型別 單獨的tag 結構體型別名 不能稱之為結構體型別 結構體變數名 2 定義的同時使用typedef 相當於定義結構體 為結構體起新名字 typedef struct tag 結...
結構體對齊(記憶體對齊
有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...