1. 程式人生 > 實用技巧 >c++中記憶體分割槽

c++中記憶體分割槽

c++中記憶體分割槽


概述

​ c++在程式執行過程中,將記憶體大體分為四個區域:

  • 程式碼區:存放函式體的二進位制程式碼,由作業系統管理
  • 全域性區:存放全域性變數和靜態變數以及常量
  • 棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數
  • 堆區:由程式設計師分配釋放(delete)和分配(new) ,程式結束會由作業系統回收
意義:因為不同區域存放的資料,具有不同生命週期,這大大地使我們程式設計更加靈活

程式執行前

程式編譯後會生成exe可執行程式,未執行該程式前可分為兩個區域:
程式碼區
存放CPU的執行的機器指令
程式碼區是共享只讀的,共享的目的是便於在頻繁執行程式過程中,只需要訪問一份程式碼,減少一定的記憶體開銷。 只讀可以防止程式意外的修改指令

全域性區:
存放全域性變數和靜態變數
全域性區還包含了常量區,字串常量和其他常量

示例:

//全域性變數
int global_varA = 10;
int global_varB = 10;
const int const_global_a = 1;
const int const_global_b = 1;

int main(int argc, char const *argv[]) {

//    區域性變數
 int a = 10;
 int b = 10;
 std::cout << "區域性變數a的地址:" << &a << std::endl;
 std::cout << "區域性變數b的地址:" << &b << std::endl;

 std::cout << "-----------------------------------------" << std::endl;

//全域性變數
 std::cout << "全域性變數global_varA的地址為:" << &global_varA << std::endl;
 std::cout << "全域性變數global_varB的地址為:" << &global_varB << std::endl;

 std::cout << "-----------------------------------------" << std::endl;

//靜態變數
 static int static_A = 1, static_B = 1;
 cout << "靜態變數static_A的地址為: " << &static_A << endl;
 cout << "靜態變數static_B的地址為: " << &static_B << endl;

 std::cout << "-----------------------------------------" << std::endl;
 cout << "字串常量地址為: " << &"hello world!" << endl;
 std::cout << "-----------------------------------------" << std::endl;

//    全域性靜態常量
 cout << "全域性常量const_global_a的地址為: " << &const_global_a << endl;
 cout << "全域性常量const_global_b的地址為: " << &const_global_b << endl;

 std::cout << "-----------------------------------------" << std::endl;
//    區域性靜態常量
 const int l_g_a = 1;
 const int l_g_b = 1;
 cout << "區域性常量l_g_a的地址為: " << &l_g_a << endl;
 cout << "區域性常量l_g_b的地址為: " << &l_g_b << endl;
 return 0;
}

程式執行後

棧區:
* 由編譯器自動分配釋放, 存放函式的引數值,區域性變數等
* 注意:函式不能返回區域性變數的地址

示例:

     #include <iostream>
using namespace std;
#include <math.h>
int* fun()
{
 int a = 110;//區域性變數存在棧區,函式執行完後自動釋放
 return &a;//返回區域性變數地址
}
int main(int argc, char const* argv[])
{
 int* p = fun();
 cout << *p << endl;
 cout << *p << endl;

 //    system("pause");
 return 0;
}  

堆區:

  * c++中用new來開闢相關型別的記憶體, deletee 來釋放
        * 由程式設計師分配和釋放,如果程式設計師不釋放,那麼程式結束時將由作業系統回收

示例:

#include <iostream>
using namespace std;
#include <math.h>
int* fun()
{
    int* p = new int(101);
    return p;
}
int main(int argc, char const* argv[])
{
    int* p = fun();
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    delete p;//釋放記憶體
    cout << *p << endl;//輸出的值和上方不一樣

    //    system("pause");
    return 0;
}