C C 中關於結構體內存對齊問題

2021-10-02 22:45:26 字數 863 閱讀 4013

第乙個成員在與結構體變數偏移量為0的位址處。

其他成員要對齊到某個數字(對齊數)的整數倍的位址處。

如果設定了記憶體對齊為 i 位元組,類中最大成員對齊位元組數為j,那麼整體對齊位元組n = min(i, j) 。

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

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

當設定的對齊位元組數大於類中最大成員對齊位元組數時,這個設定實際上不產生任何效果(例項2);當設定對齊位元組數為1時,類的大小就是簡單的把所有成員大小相加

效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需作兩次記憶體訪問;而對其的記憶體數隻需要對齊一次。

記憶體對齊是一種拿空間換時間的做法

如果我們既要滿足記憶體對齊,又要節省空間,就應該讓占用空間小的記憶體盡量集中在一起

//沒有指定對齊位元組,則n = 最大成員(int i)的大小4

struct s1

;//整體向4對齊後12

//指定對齊位元組為8,則n = min(8,4) = 4

struct s2

;//整體向4對齊後8

//指定對齊位元組是1,則n = min(1,4) = 1)

struct s3

;//整體向1對齊後7

復合資料型別,如union,struct,class的對齊方式為成員中對齊方式最大的成員的對齊方式。

預處理命令pragma=可以改變預設對齊數。

C C 結構體內存對齊

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

C C 結構體內存對齊

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

c c 結構體內存對齊

以上輸出的結果並非實際成員占用的位元組數,這就是結構體的記憶體對齊!1.平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料 某些硬體平台只能在某些特定位址處取某些特定的資料,否則就會丟擲硬體異常 也就是說在計算機在記憶體讀取資料時,只能在規定的位址處讀資料,而不是記憶體中任意位址都是...