1、記憶體對齊的概念
對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。
2、記憶體對齊的意義
需要記憶體對齊的根本原因在於cpu訪問資料的效率問題。
從某種意義上講,記憶體對齊就是空間換時間
3、結構體大小的判斷
struct s1
;struct s2
;int
main()
進行計算前我們先講述一些知識。
1、第乙個成員在與結構體變數偏移量為0的位址處。
意味著假如有一塊記憶體,第乙個成員所在的位置就是該記憶體開始的地方
2、對齊數的概念
結構體的每個成員都有它的對齊數,對齊數的定義:該成員的大小與系統預設對齊數的最小值,在vs編譯器中預設8,linux中預設4。
其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
3、結構體的整體大小必須是最大對齊數的整數倍
也就是說,若該結構體成員中最大對齊數為4,那麼總結構體的大小必須是4的整數倍,若在計算中不夠整數倍需要在記憶體中留處空白補齊
因此,s1的大小就是 8,s2的大小就是 12
感謝瀏覽。
C 深入(記憶體模型)
為什麼有資料型別?現實生活中的資料太多而且大小形態不一。資料型別與記憶體的關係 資料型別的本質 建立變數的模具,是固定大小的別名。include stdio.h include stdlib.h include string.h int main 問題 b,b所代表的資料型別不一樣 b代表的是陣列首...
C語言 記憶體對齊
寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?講講位元組對齊吧.分割線 如果體系結構是不對齊的,a中的成員將會乙個挨乙個儲存,從而sizeof a 為11。顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體 繫結構...
c語言記憶體對齊
記錄平常所學,以便回顧。c語言中存在著記憶體對齊問題,在struct儲存中尤為明顯,這裡先介紹一種情況,以後接著補充。typedef unsigned char u8 typedef unsigned short u16 typedef unsigned long u32 typedef unsig...