現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。簡單來說就是犧牲空間來增加訪問效率。
其準則如下:
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
下面來說一說對齊的規則:
例1:struct test1
;sizeof(test1) = 24
讓我們看看他們在記憶體上是如何分布的:
iaia
iaia
dada
dada
dada
dada
cadouble型別的da首位址必須為8的倍數,編譯器在ia和da的中間加4個填充位元組,結構體的總大小為8的倍數,編譯器在末尾填充7個填充位元組。
例2:struct test2
;sizeof(test2) = 16
sasa
sbsb
dada
dada
dada
dada
cashort sb的對齊值為2,所以可以在3,4位置上。
那我們如何能按自己的意願指定對齊值呢?
使用 #pragma pack(n),編譯器會按n和結構體中最長的成員的長度中較小者為其值。
使用#pragma pack(2)之後 sizeof(test2) = 12,da的首位址為4。
若想在同一檔案中使不同結構體按不同值來對齊,還可使用__attribute__ ((__packed__))來為每乙個結構體宣告。
C C 位元組對齊
什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...
c c 位元組對齊
什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...
C C 位元組對齊
概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。為什麼位元組需要對齊 根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為0x...