結構體struct記憶體對齊

2021-10-03 21:43:47 字數 1081 閱讀 8201

原因:

結構體內存對齊是因為,對於計算機來說讀取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個位...