首頁 > 軟體

C++核心程式設計之記憶體分割區詳解

2022-03-28 13:01:16

1、記憶體分割區模型:

C++程式在執行時,將記憶體大方向劃分成4個區域

(1)程式碼區:存放安徽唸書體的二進位制程式碼,由作業系統進行管理的

(2)全域性區:存放全域性變數和靜態變數以及常數

(3)棧區:由編譯器自動分配釋放,存放函數的引數值,區域性變數等

(4)堆區:由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統回收

記憶體四區意義:不同區域存放的資料,賦予不同的生命週期,給我們更大的靈活程式設計

2、程式碼區:

在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域

程式碼區:

(1)存放CPU執行的機器指令(二進位制的機器指令)

(2)程式碼區是共用的,共用的目的是對於頻繁被執行的程式,只需要在記憶體中有一份程式碼即可

(3)程式碼區是唯讀的,使其唯讀的原因是防止程式意外地修改了它的指令

3、全域性區:

(1)全域性變數和靜態變數存放在此

(2)全域性區還包括了常數區,字串常數和其他常數也存放在此(字串常數和const修飾的全域性變數)

(3)該區域的資料在程式結束後由作業系統釋放(不是由我們來控制的)

不在全域性區中的:

1、區域性變數   

2、const修飾的區域性變數(區域性常數)

4、小結:

1.C++中在程式執行前分為全域性區和程式碼區

2.程式碼區特點是共用和唯讀

3.全域性區中存放全域性變數、靜態變數、常數

4.常數區中存放const修飾的全域性常數和字串常數

5、程式碼演示:

//程式的記憶體模型-記憶體四區-全域性區
#include <iostream>
using namespace std;
//1 全域性變數
int g_a = 10;
int g_b = 10;
//const修飾的全域性變數,全域性常數
const int c_g_a = 10;
const int c_g_b = 10;
int main() {
    //2 建立普通區域性變數
    int a = 10;
    int b = 10;
    cout << "The address of local variable a is: " << &a << endl;
    cout << "The address of local variable b is: " << &b << endl;
    cout << "Global variable g_a's address is: " << &g_a << endl;
    cout << "Global variable g_b's address is: " << &g_b << endl;
    //3 靜態變數 在普通變數前面加static,屬於靜態變數
    static int s_a = 10;
    static int s_b = 10;
    cout << "The address of static variable s_a is: " << &s_a << endl;
    cout << "The address of static variable s_b is: " << &s_b << endl;
    //4 常數
    //4.1 字串常數
    cout << "The address of the string constant is: " << &"Hello World" << endl;
    //4.2 const修飾的變數
    //4.2.1 const修飾的全域性變數
    cout << "Global constant c_g_a's address is: " << &c_g_a << endl;
    cout << "Global constant c_g_b's address is: " << &c_g_b << endl;
    //4.2.2 const修飾區域性變數
    const int c_l_a = 10;
    const int c_l_b = 10;
    cout << "Local constant c_l_a's address is: " << &c_l_a << endl;
    cout << "Local constant c_l_b's address is: " << &c_l_b << endl;
    return 0;
}

6、執行結果:

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!   


IT145.com E-mail:sddin#qq.com