關於struct結構體自然對齊的思考

2021-06-04 11:10:38 字數 756 閱讀 3203

struct x

char m_ch;

int m_count;

cout << sizeof(x) << endl;的結果顯示為 8。

按照復合型別所佔位元組數為結構體中的成員所佔位元組的總和,得出的結果應該為 5。

多出的3個位元組是怎麼回事?

原來為了提高物件及其成員的訪問效率,編譯器不會隨便地在任意乙個邏輯記憶體位址上建立c++/c的變數和物件,它們的記憶體中的起始位址

即物件的位址應該要被資料成員中自然對齊要求最嚴格的位元組數整除(例如,double的變數的位址要能夠被8整除,而int變數的位址只需能夠被4整除。所以double型別的自然對齊要求就要比int型別嚴格),其他成員的起始位址也需要滿足各自的自然對齊要求。

在以上部落格中指出:

網路上也有別的朋友說,是按照結構體裡面最大的單元對齊的,這種說法是錯誤的,原因在於,他舉的case全是int最大,而32bit的cpu總是按32-bit對齊正好是int的長度,這樣就產生了錯誤的認識。

例struct c

;sizeof()的大小是12,不是2*sizeof(double)哦。

但我用sizeof(c)求出的結果確實為16。所以按照結構體裡面最大的單元對齊的說法應該是正確的,與cpu沒有關係。

回到剛剛提出的問題,就很容易明白顯示結果為8的原因。物件x的起始位址應該要被4整除。為了m_count滿足自然對齊,要為m_ch填充3個位元組。

所以總位元組數為8!

如果以上結果有什麼錯誤的地方,請指出!  繼續學習中·····

結構體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 結...

結構體struct的對齊問題

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