結構體struct 的記憶體對齊問題(c語言)

2021-08-19 22:12:10 字數 978 閱讀 6838

對齊原因:(1)為了避免移植後計算機讀取資料出錯(各個硬體平台對儲存空間的處理上有很大的不同,某些硬體平台只能在某些位址處去某些特定型別的資料,否則會出錯

)。(2)為了提高計算機取數的效率(比如有些平台每次讀都是從偶位址開始,如果乙個int型(32位系統)如果放在偶數字址開始的地方,那麼一乙個讀週期就可以讀出這32bit,而如果存放在奇數字址開始的地方,就需要2個讀數週期,並對兩次讀出的結果的高低位元組進行並湊才能得到該32bit資料。顯然在讀取效率上下降了很多)。

對齊規則:

(1)結構體變數的首位址能夠被其最寬型別成員的大小整除;

(2)結構體成員的首位址是其大小的整倍數,若不是,編譯器在該成員與前乙個成員之間填充相應的位元組;

(3)結構體的大小是其最大成員大小的整倍數,若不是,編譯器在最後乙個成員後填充相應的位元組;

如圖所示:       

結構體struct記憶體對齊

原因 結構體內存對齊是因為,對於計算機來說讀取4個位元組的記憶體空間比讀取1 2 3個位元組的要更高效。但是也根據編譯器而定,而且自己也可以改變對齊記憶體的大小用 預編譯命令 pragma pack n 規則 1.第乙個元素offset偏移到位址為0的記憶體上。2.之後的元素對齊到對齊數大小的整數倍...

struct結構體的記憶體對齊

1 結構體中第乙個成員在 與結構體變數偏移量為0 的位置 2 其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處 注意 1 對齊數 編譯器預設的乙個對齊數 與 該成員所佔空間的位元組數 的較小值 2 vs中預設的對其數是8,linux中的預設值為4。3 成員對其後,結構體自身也要對齊。結構體的總...

結構體struct的對齊問題

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