由筆試題引發的結構體位元組對齊規則總結

2021-10-25 22:30:44 字數 1287 閱讀 5136

今天做招銀網路的一道選擇題

給的正確答案是c,我選的a,之後又實測了下,認為就應該選a

很多網上的位元組對齊規則是這樣:

按照這樣計算

struct mystruct

innerstruct;

};

mystruct結構體的長度是:

4(int)

+1(char)

+3(根據第一條,補齊innerstruct首位址為double倍數)

+4(int)

+4(32bit-long)

+8(double)

+1(char)

+7(根據第三條,為8的倍數,需要填充7個位元組)

= 32byte

其中我認為最有問題的就是第三條

根據我之前的經驗,和我之前看的一篇文章,其正確規則應該是這樣

設對齊位元組數為n(n = 4或8,區別於32位或者64位作業系統),每個成員記憶體長度為li, max(li)為最大的成員記憶體長度,位元組對齊規則是:

注意第三條的min(n,max(li)),也就是說,不僅要參考最大元素的長度,還要看編譯器預設位元組對齊數的長度。這裡要說下,位元組對齊和資料型別的長度都是由編譯器決定!如果按照這個規則,最後乙個補齊的位元組數就不是double長度的整數倍,而是,min(預設位元組對齊長度,8),32位機器一般預設4位元組對齊,即只需填充3,最終也就是佔28個位元組。

我們知道#pragma pack (n)可以指定位元組對齊數,所以我在vs2015上實測

#pragma pack (4)時,答案為28 4

#pragma pack (8)時,答案為32 4

即使不加#pragma pack 強制對齊,在vs x86平台上,其答案也是28 4

在64位ubuntu下,利用gcc編譯32位程式,實測

#pragma pack (4)時,答案為28 4

#pragma pack (8)時,答案為28 4

很奇怪,可能gcc做了某些優化,因為32位程式一般執行在32位平台上,

cpu一次訪問4位元組。

所以無論怎麼說,這道題目,以及網上的有些總結確實存在問題,本文或許也有疏漏,如有問題也可以相互討論。

另外,關於巢狀結構體,有些複雜,這裡總結下:

由結構體對齊而引發的思考。。。 一

由於本文初期在csdn中編輯的不是太好,現在將其發表於看雪論壇中,具體鏈結如下 從結構體對齊到 c 類物件記憶體模型之一結構體對齊 結構體與類在 c 中非常相似,他們的記憶體排布是乙個比較有意思的知識點,故而準備寫一些文章來 這些問題。首先從結構體的記憶體對齊說起,所有的測試環境都是 vs201x ...

結構體位元組對齊的規則

位元組對齊的計算規則 1 先看結構中最大型別的資料,包括巢狀結構體 如果有 確定一行的最大數。2 如果只有乙個元素,那就是這個元素的大小,不需要補齊。4 巢狀子結構體則要看看這個元素的整個大小 就是累加的大小,不是對齊的大小 放到這一排的剩餘位置能不能放下,放不下則從下一行開始,子結構體中的元素排列...

C語言結構體的位元組對齊

在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第...