以前只記得結構體對齊,是對齊最長的那個成員,但現在發現並不是這樣,看以下兩個示例(64位 g++ 9.3.0 編譯)
這裡先給出分析結構體長度的一般方法:class b
= 1b。最寬成員是虛指標,所以; // 8
static int c; // 0
static int d; // 0
static int f; // 0
};cout《值得一提的是靜態成員不佔空間
這裡虛指標 = 8b,char b
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 結...