c c 結構體內存對齊

2021-10-16 22:10:52 字數 1147 閱讀 9662

以上輸出的結果並非實際成員占用的位元組數,這就是結構體的記憶體對齊!1.平台原因(移植原因):

「不是所有的硬體平台都能訪問任意位址上的任意資料;某些硬體平台只能在某些特定位址處取某些特定的資料,否則就會丟擲硬體異常」。也就是說在計算機在記憶體讀取資料時,只能在規定的位址處讀資料,而不是記憶體中任意位址都是可以讀取的。

2.效率原因:

正是由於只能在特定的位址處讀取資料,所以在訪問一些資料時,對於訪問未對齊的記憶體,處理器需要進行兩次訪問;而對於對齊的記憶體,只需要訪問一次就可以。 其實這是一種以空間換時間的做法,但這種做法是值得的。

結構體對齊規則

第乙個成員在結構體變數偏移量為0 的位址處,也就是第乙個成員必須從頭開始。

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數為編譯器預設的乙個             對齊數與該成員大小中的較小值。vs中預設值是8 linux預設值為4(可以通過#pragma        pack (n)      修改,使用#pragma pack(show) 可以檢視對齊值),但修改時n的取            值只能設定成1,    2,4,8,16.

結構體總大小為最大對齊數的整數倍。(每個成員變數都有自己的對齊數)

如果巢狀結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是          所有最大對齊數(包含巢狀結構體的對齊數)的整數倍。

結構體對齊示例

C C 結構體內存對齊

c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會...

C C 結構體內存對齊

c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之...

c c 結構體 記憶體對齊原則

原則1 資料成員對齊規則 結構的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的倍數開始 比如int在32位機為4位元組,則要從4的整數倍位址開始儲存 原則2 結構體的總大小,也就是sizeof的結果。必須是其內部最大成員的整數倍。不足的要補齊。原則...