記憶體分配方式? 宣告和定義的區別?

2021-07-31 11:50:41 字數 1275 閱讀 8971

記憶體分配方式有幾種?

靜態儲存區 棧 堆 的記憶體分配

1,從靜態儲存區域分配記憶體。程式編譯的時候記憶體已經分配好了,並且在程式的整個執行期間都存在,例如全域性變數。

2,在棧上建立。在執行函式時,函式內區域性變數的儲存單元可以在棧上建立,函式結束時這些儲存單元自動被釋放。

處理器的指定集中有關於棧記憶體的分配運算,因此效率比較高,但是分配的記憶體容量有限。

3,在堆上分配記憶體,亦稱動態記憶體分配,程式在執行的時候用malloc函式或new運算子申請任意大小的記憶體,程式設計師

要用free函式或delete運算子釋放記憶體。動態記憶體使用非常靈活,但問題也很多。

宣告(declaration )指定了乙個變數的識別符號,用來描述變數的型別,是型別還是物件,或者函式等。宣告,用於編譯器(compiler)識別變數名所引用的實體。以下這些就是宣告:

extern int bar;

extern int g(int, int);

double f(int, double); // 對於函式宣告,extern關鍵字是可以省略的。

class foo; // 類的宣告,前面是不能加class的。

定義是對宣告的實現或者例項化。聯結器(linker)需要它(定義)來引用記憶體實體。與上面的宣告相應的定義如下:

int bar;

int g(int lhs, int rhs)  

double f(int i, double d)  

class foo {};// foo 這裡已經擁有自己的記憶體了,對照上面兩個函式,你就應該明白{}的用處了吧?

3 無論如何,定義 操作是只能做一次的。如果你忘了定義一些你已經宣告過的變數,或者在某些地方被引用到的變數,那麼,聯結器linker是不知道這些引用該連線到那塊記憶體上的。然後就會報missing symbols 這樣的錯誤。如果你定義變數超過一次,聯結器是不知道把引用和哪塊記憶體連線,然後就會報 duplicated symbols這樣的錯誤了。以上的symbols其實就是指定義後的變數名,也就是其標識的記憶體塊。

4 總結

如果只是為了給編譯器提供引用標識,讓編譯器能夠知道有這個引用,能用這個引用來引用某個實體(但沒有為實體分配具體記憶體塊的過程)是為宣告。如果該操作能夠為引用指定一塊特定的記憶體,使得該引用能夠在link階段唯一正確地對應一塊記憶體,這樣的操作是為定義。是為了讓編譯器正確處理對宣告變數和函式的引用。定義是乙個給變數分配記憶體的過程,或者是說明乙個函式具體幹什麼用。

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...

記憶體分配方式

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...