C 記憶體對齊

2021-09-24 15:33:40 字數 1536 閱讀 7604

現代計算機體系中cpu按照雙字、字、位元組訪問儲存記憶體,字是計算機進行資料處理和運算的單位,若未經一定規則的對齊,cpu的訪址操作將會異常的複雜,所以現代編譯器中都會對記憶體進行自動對齊。

結構體struct中的成員在記憶體中的分配是連續的,struct 內的首位址就是 struct 內第乙個資料成員的位址,即 struct 內第乙個資料成員離 struct 開始的距離 offset = 0。

對齊規則:

sizeof的基本作用是判斷資料型別或者表示式的長度(位元組數)。

(注意:sizeof不是乙個函式,而是乙個c++中的關鍵字)

64位visual studio 2017環境下,c++內建型別長度:

cout <<

sizeof

(char

)<< endl;

// 1

cout <<

sizeof

(short

)<< endl;

// 2

cout <<

sizeof

(int

)<< endl;

// 4

cout <<

sizeof

(long

)<< endl;

// 4

cout <<

sizeof

(long

long

)<< endl;

// 8

cout <<

sizeof

(double

)<< endl;

// 8

連續申明的變數是否可以在記憶體中連續儲存(即不填充位元組),由變數長度之和是否超出乙個塊(有效對齊值個位元組構成乙個塊,例如,8個位元組為1個塊)決定。

例如(8位元組對齊):

struct

; // 16

int a佔4位元組,char b佔1位元組,加起來為5個位元組,不超過1個塊,可以連續儲存。double c佔8個位元組,加起來13個位元組,超過1個塊,double c 在下乙個塊中儲存。所以,最後儲存情況為:4位元組 int a,1位元組 char b,3位元組填充,8位元組 double c,共16位元組。

struct

st;cout <<

sizeof

(st)

<< endl;

// 16

#pragma pack的主要作用就是改變編譯器的記憶體對齊方式,#pragma pack(n)的作用是改變編譯器的對齊係數,n 值可取(1,2,4,8,16),預設8位元組對齊。

參考:

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