C++内存的分区
C++內存分為四個區:
(1)代碼區:存放代碼轉譯成的二進制代碼。
(2)全局區:存放全局變量、靜態變量(static)、常量(如字符串常量)。 全局區中還包含一個常量區,用于存儲常量(字符串、全局const)。局部const修飾的常量在棧區。
(3)棧區:存放局部變量、函數的參數等。
(4)堆區:程序員自己開辟(new)、釋放(delete)。(這么說其實不準確,因為嚴格意義上,C中通過malloc和free開辟的空間是堆,C++中new和free開辟的空間是自由存儲區)。
?
C++編譯通過后生成exe可執行文件,在文件運行前,只有兩個區:
(1)代碼區:存放 CPU 執行的機器指令。代碼區共享且只讀。
(2)全局區:存放全局變量,靜態變量、字符串常量、局部常量。
#include <iostream>
using namespace std;int a1 = 10; // 全局變量,全局區
const int a2 = 10; // 全局常量,全局區
int main(int argc,char** argv)
{int a3 = 10; // 局部變量,棧區const int a4 = 10; // 局部常量,棧區static int a5 = 10; // 靜態變量,全局區string a6 = "123"; // 字符串常量,全局區int* a7 = new int(10);// 堆區delete a7;return 0;
}
堆區和棧區的區別
(1)棧區由程序自動開辟和釋放,棧區由程序員開辟和釋放。如果程序員沒有釋放的話,程序會在結束時自動釋放。
(2)棧是一片連續的地址。而堆的地址不連續,是通過鏈表連接的,多次new和delete可能導致內存的泄露。
(3)棧是的內存是向低地址擴展,即棧頂地址和棧的最大容量由系統決定。如果申請的空間大于棧的空間,就會溢出。而堆是向高地址擴展,空閑內存是以鏈表的形式鏈接的,且鏈表的遍歷方向是由低地址向高地址的。
(4)棧的效率高于堆。
總結
- 上一篇: 哈利波特作者是谁啊?
- 下一篇: C++程序编译过程