C記憶體對齊

2021-07-30 08:04:25 字數 1299 閱讀 8128

關於記憶體對齊的原因有:

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 ...