C++記憶體管理基礎
阿新 • • 發佈:2020-12-03
C++中可以訪問的記憶體,通常可以分為三類:靜態常量區、呼叫棧和堆。
靜態常量區
靜態常量區是編譯器在編譯期間就已經確定好的資料。例如在全域性範圍內宣告const char text[] = "Hello World!"
,text就會被存放在靜態常量區。
特點
- 只讀;
- 大小固定;
- 無法管理;
- 可以利用其特性在邏輯上做一些特定的優化。
呼叫棧
特點
- 被動分配,被動回收;
- 大小在執行時有一個動態調整的過程;
- 大小有系統限制;
- 底大頂小
問題
- 為什麼變數有作用域?
防止不同的變數使用相同的棧記憶體,導致後面的變數覆蓋前面的資料,從而在使用前面的變數時輸出後面的變數。所以設定作用域,使變量出了作用域不再有效。
- 為什麼不建議使用遞迴?
因為棧記憶體是一個非常珍貴的資源,而使用遞迴有時會產生死迴圈,將消耗棧記憶體,直至消耗完,從而產生StackOverflow的錯誤。
注意
- 棧記憶體先進後出,輪流使用。
同一塊記憶體要在佔用它的函式執行完畢,記憶體被回收之後,其它函式才能使用這一塊記憶體。棧中的記憶體可以被輪流使用,這也是為什麼正常的程式可以一直執行,而不會出現棧溢位的問題。
- 不要在函式體中宣告大塊記憶體(大型陣列,大型結構體)。
例如宣告int arr[10240000]
,十分佔用棧記憶體。棧記憶體十分珍貴,應避免這種情況。
視訊連結
(含字幕)C++ 讓你不再害怕記憶體和指標 其一_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili