關於記憶體對齊的原因有:
1、平台原因(移植原因):
不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的數 據,否則丟擲硬體異常。
2、效能原因:
資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次內 存 訪問;而對齊的記憶體訪問僅需要一次訪問。
記憶體對齊的概念則是:各種資料型別在空間上按一定規則排列,而不是順序地乙個接乙個排列。提到一定規則,引入規則之前,先來做個概念解釋:每個特定平台的編譯器都有乙個預設的「對齊係數」,也可叫對齊模數。而這個對齊係數,我們是可以通過**來修改的:#pragma pack(n), 其中n就是對齊係數。
記憶體對齊中按照:1,2,4,8,16進行對齊
下面就引入對齊規則:
1.結構(struct)(
或聯合(union))
的資料成員,第乙個資料成員放在
偏移量為
0的地方,以後每個資料成員的對齊按照
#pragma pack(n)
指定的數值n和這個資料成員自身長度中,比較小的那個進行。
struct stu;
printf("size :%zu\n",sizeof(struct stu));
輸出為:16
輸出16
;是因為char 是佔乙個位元組的,但是它後面的short是2佔位元組,所以char後面補1位,int 佔4位元組,而它前面的2個成員變數剛好是佔了4個位元組,所以緊接著後面寫入int型別變數,再後面的long型別是佔8位元組的,而它前面的所有型別之和也是8的倍數,所以也是緊接著寫入long變數。所以輸出16
2.結構
(或聯合
)的整體對齊規則:在資料成員完成各自對齊之後,結構
(或聯合
)本身也要進行對齊,對齊將按照
#pragma pack
指定的數值和結構
(或聯合
)最大資料成員長度中,比較小的那個進行。
struct s3
; struct s4
; struct s5
; printf("s5 = %lu\n",sizeof(struct s5));
輸出:8
3.
當#pragma pack的n
值等於或超過所有資料成員長度的時候,這個
n值的大小將不產生任何效果。
C 記憶體對齊
vc6.0編譯器對記憶體對齊的管理方式遵循以下兩個原則 1.對於結構體內部變數的對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即1的倍數 int 偏移量必須為sizeof int 即4的倍數 float 偏移量必須為sizeof float ...
c 記憶體對齊
一.計算struct的size有兩個原則 pragma pack n n是編譯器的對齊位元組數 1 struct中各成員按照對齊原則 在為當前變數 設為a 分配記憶體時,要參考之前所有變數的偏移量之和 設為d d必須是min n,sizeof a 的倍數,否則編譯器會自動在最後補上缺少的位元組數。2...
C 記憶體對齊
c 中的記憶體對齊 記憶體對齊 在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include 2 using namespace std 3 4structx1 ...