C C 記憶體管理與記憶體對齊

2021-09-16 20:29:36 字數 1563 閱讀 3299

// 判斷大小端

uint32_t word = 0xaabbccdd;

char* p = (char*) (&word);

for(int i=0; i<4; ++i)

// 大端結果:aa bb cc dd

// 小端結果:dd cc bb aa

:bss段(bss segment)通常是指用來存放程式中未初始化,或初始化為0的全域性變數,靜態區域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配

資料段:資料段(data segment)通常是指用來存放程式中已初始化為非0的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

從上圖可以看出,棧優先分配高位址,然後往低位址走;堆優先分配低位址,然後往高位址走。另外,在為結構體資料分配記憶體時,先為結構體資料分配一片記憶體空間,此時較低位址為結構體資料的入口,然後從低位址到高位址按結構體資料成員定義順序依次分配記憶體空間。例如:

typedef struct t1;
結構體成員按定義的順序其儲存位址依次增長

硬體原因:提公升cpu記憶體訪問速度

cpu是按塊讀取記憶體的,比如一次性讀取4個位元組,比如要讀取乙個4位元組大小的資料,若資料從1位元組開始,則需要先讀0-3位元組,再讀4-7位元組,再去掉0位元組和4-7位元組。

參考文獻:

為什麼要進行結構體內存對齊

從c語言結構對齊重談變數存放位址與記憶體分配

c語言函式堆疊的思考

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

C C 記憶體對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...