C C 結構體 struct 對齊問題

2022-09-20 17:48:11 字數 1674 閱讀 9575

以前只記得結構體對齊,是對齊最長的那個成員,但現在發現並不是這樣,看以下兩個示例(64位 g++ 9.3.0 編譯)

class b

; // 8

static int c; // 0

static int d; // 0

static int f; // 0

};cout《值得一提的是靜態成員不佔空間

這裡虛指標 = 8b,char b= 1b。最寬成員是虛指標,所以char b對齊為 8b,所以總 16b,可能一開始大家都是這麼理解的(但實際上不對,不能這麼說,後文會指正)

class a

;class c

;cout《類 c 中char c成員實際結果是 4b。

如果按原來的理解,類 a = 8b,類 c 繼承後最寬成員是 a 類,那char c不應該對齊為 8b 嗎?

參考 leetcode某討論

假定是gcc,用預設的對齊係數 4 (編譯器決定)

對齊值是對齊係數和結構體各成員長度最大值的較小值

對齊要求各成員起始偏移量是對齊值和它的長度的較小值的倍數

一句話概括就是

參考 leetcode某討論

struct student ;

這裡先給出分析結構體長度的一般方法:

第一步,得出對齊值:

第三步,分析結構體大小

再把例子重新放上來吧,以免往上翻

class b

; // 8

static int c; // 0

static int d; // 0

static int f; // 0

};cout《之前說char b對齊 8b 是因為對齊最寬的虛指標長度,其實是不對的。我測試了對齊值分別為 4 和 8 兩種情況,測試結果不相同

// ********************==== v1 *************************====

#pragma pack(4) // 指定對齊值 4

class b

; // 8

static int c; // 0

static int d; // 0

static int f; // 0

};cout《可以發現兩種結構體char b對齊 4b 和 8b,因此可以得出結論簡單地說對齊最長成員是不對的

這裡我也測試了 4 和 8 兩種對齊值的情況,但讓人意外的是,測試結果稍微有點超出我的預期。所以我目前還不敢確定自己的看法是否正確,僅作參考,也歡迎指正

// ********************==== v1 *************************====

#pragma pack(4) // 指定對齊值 4

class a

;class c

;cout《是不是和預期不同?

結構體struct的對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾很久。其實相關的文章很多,感覺說清楚的...

結構體struct記憶體對齊

原因 結構體內存對齊是因為,對於計算機來說讀取4個位元組的記憶體空間比讀取1 2 3個位元組的要更高效。但是也根據編譯器而定,而且自己也可以改變對齊記憶體的大小用 預編譯命令 pragma pack n 規則 1.第乙個元素offset偏移到位址為0的記憶體上。2.之後的元素對齊到對齊數大小的整數倍...

C語言 結構體struct 結構體對齊

1 定義乙個結構體 順便例項結構體變數 struct tag 結構體型別名 struct tag 這兩者共同構成了結構體型別 單獨的tag 結構體型別名 不能稱之為結構體型別 結構體變數名 2 定義的同時使用typedef 相當於定義結構體 為結構體起新名字 typedef struct tag 結...