現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排序,而不是順序的乙個接乙個的排放,這就是位元組對齊。
各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些框架的cpu在訪問乙個沒有進行對齊的變數時候會發生錯誤,那麼在這種框架下程式設計必須保證位元組對齊,其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶數字址開始,如果乙個int型別(假設32位系統)如果存放在偶位址開始的地方,那麼乙個讀週期就可以了讀出這32bit,而如果存放在奇位址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit資料。
1、基本資料型別的自身對齊值:
1位元組:char型
2位元組:short型
4位元組:int,float型
8位元組:double型
2、程式的指定對齊值:即#pragma pack(value)時的指定對齊值value
3、自定義型別的自身對齊值:結構體或類的成員中自身對齊值最大值
4、自定義型別的有效對齊值:自定義型別的自身對齊值和指定對齊值中較小的值。
總結:利用空間來換時間
典型的例子:計算結構體的大小
計算結構體的大小
c語言位元組對齊
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...