現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。
基本資料型別自身對齊,也叫自然對齊。就是說資料的儲存位址可以被其自身位元組長度整除。例如float型的資料儲存位址必須為4的整數倍。
原因有兩點 :
儲存空間的處理上有很大的不同,一些平台對某些特定型別的資料只能從某些特定位址開始訪問,否則將會引發錯誤;
方式:位元組的對齊方式和處理器位數以及編譯器選項有關,一般對於32位機,在vc中預設是4位元組對齊的,gnu gcc 也是預設4位元組對齊。
也可以通過一些配置,指令,關鍵字來修改位元組對齊方式。
__attribute((aligned (n))),讓所作用的結構成員對齊在n位元組自然邊界上。如果結構中有成員的長度大於n,則按照最大成員的長度來對齊。__attribute__ ((packed)),取消結構在編譯過程中的優化對齊,按照實際占用位元組數進行對齊。
原則: 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;
結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
當計算結構體總體大小時,容易忽略填充,以使總體大小為最寬基本型別成員大小的整數倍。
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...
C語言位元組對齊
1.什麼是對齊?現代計算機中記憶體空間都是按照位元組 byte 劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序地乙個接乙個地排放,這就是對齊。2.計算機為什麼要對齊?...