C 記憶體對齊

2021-08-18 14:17:04 字數 1407 閱讀 9276

對於程式設計師來說,最煩惱最耗時的工作莫過於與記憶體打交道,但是記憶體至關重要,不得不對其保持最大的警惕。

效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界對其。原因在於,為了訪問未對齊的記憶體,處理器需要做兩次記憶體訪問,而對齊的記憶體訪問僅需要一次。

計算機通常以字大小的塊來處理記憶體,乙個字是計算機資料的自然單位,通常由計算機架構決定。現代通用計算機通常是4個位元組(32位)或8個位元組(64位)。

假設處理器,一次讀取4個位元組的資料。且記憶體如圖所示

若儲存4位元組的int型別,不需要進行額外工作就可以正確對齊,因為int資料型別大小與該架構的資料自然單元契合。

若我們放置乙個charshortint

這將需要兩次記憶體訪問,並且進行移位來獲取int資料。這將比記憶體對齊的資料至少花費兩倍時間,因為計算機科學家們提出了記憶體對齊的方法。在本例中,新增一些padding在第乙個位元組,確保有效對齊

上圖所示被認為是自然對齊,編譯器會自動新增正確的padding根據目標平台。

預設對齊

如果有指定對齊位元組數目,則編譯器會按類或結構中最大型別長度來對齊。可以通過語句#pragma pack(i)來指定對齊位元組數目,i的取值為1, 2, 4, 8, 16

對齊規則:

未指定對其位元組,則n = 4即最大成員int的大小

struct foo;
此時成員共占用[0-7] 8個位元組,還需整體對齊,大小應該是4的倍數,即8假設指定對其位元組為8, 那麼n = min(8, 8) = 8

struct foo
此時成員共占用17位元組,還要整體對齊,為8的倍數,故大小為24

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