日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++淺析內存分區模型概念與示例_C 語言

作者:玲瓏樓主安 ? 更新時間: 2022-11-04 編程語言

初識C++內存分區模型

在了解內存分區之前,我們先來聊一聊為什么要進行內存分區。在進行了內存分區之后,在不同的區域存放的數據,會有不同的生命周期,從而會讓程序員的編程變得更加靈活。

我們這次討論的內存模型是將內存劃分為四部分的版本,也是筆者在和黑馬學習過程中學習到的版本。

而C++在程序運行的過程中,將內存分為四個區域:

  • 代碼區

存放函數的二進制代碼,即CPU執行的機器指令,由操作系統進行管理。

  • 全局區

存放全局變量、靜態變量(static,分為全局與局部靜態變量)和部分常量。

  • 棧區

由編譯器自動分配和釋放,存放函數的參數值、局部變量、局部常量等。

  • 堆區

由程序員進行分配和釋放,而如果程序員不釋放,則在程序結束運行時,由操作系統來進行回收。

程序運行前

程序編譯后,會生成可執行程序,而在該程序未執行之前,內存分為代碼區和全局區兩個區域。

代碼區

存放函數的二進制代碼,即CPU執行的機器指令,由操作系統進行管理。

代碼區的特性是共享與只讀:

  • 共享:對于被頻繁執行的程序,在內存中只需要保存一份代碼即可。
  • 只讀:防止程序被意外修改。

全局區

存放全局變量、靜態變量(static)和部分常量。

其中部分常量為常量區,即字符串常量和全局常量( const 關鍵字修飾的全局常量);不包括局部常量。

#程序運行后

棧區

由編譯器自動分配和釋放,存放函數的參數值、局部變量、局部常量等。

堆區

由程序員進行分配和釋放,而如果程序員不釋放,則在程序結束運行時,由操作系統來進行回收。

主要利用 new 在堆區開辟內存,由 delete 進行釋放。

ps:利用 new 常見的數據,返回的是該數據對應類型的指針。

內存分區代碼示例

#include <iostream>
using namespace std;
//全局變量 全局區
int global_a=10;
int global_b=20;
//全局常量 全局區
const int global_const_a=10;
const int global_const_b=20;
//全局靜態變量 全局區
static int static_global_a=10;
static int static_global_b=20;
//形參 棧區
void func(int a){
    //局部變量 棧區
    int b=20;
    cout<<"函數func()的形參 a 的地址為:"<< &a <<endl;
    cout<<"函數func()的局部變量 b 的地址為:"<< &b <<endl<<endl;
}
int main() {
    cout<<"棧區"<<endl;
    //局部變量 棧區
    int a = 10;
    int b = 20;
    cout<<"局部變量 a 的地址為:"<< &a <<endl;
    cout<<"局部變量 b 的地址為:"<< &b <<endl;
    //局部常量 棧區
    const int const_a=10;
    const int const_b=10;
    cout<<"局部常量 const_a 的地址為:"<< &const_a <<endl;
    cout<<"局部常量 const_b 的地址為:"<< &const_b <<endl;
    //形參 棧區
    func(a);
    cout<<"全局區"<<endl;
    cout<<"全局變量 global_a 的地址為:"<< &global_a <<endl;
    cout<<"全局變量 global_b 的地址為:"<< &global_b <<endl;
    cout<<"全局常量 global_const_a 的地址為:"<< &global_const_a <<endl;
    cout<<"全局常量 global_const_a 的地址為:"<< &global_const_b <<endl;
    cout<<"全局靜態變量 static_global_a 的地址為:"<< &static_global_a <<endl;
    cout<<"全局靜態變量 static_global_b 的地址為:"<< &static_global_b <<endl;
    //局部靜態變量 全局區
    static int Static_a=10;
    static int Static_b=20;
    cout<<"局部靜態變量 Static_a 的地址為:"<< &Static_a <<endl;
    cout<<"局部靜態變量 Static_b 的地址為:"<< &Static_b <<endl;
    //字符串常量 全局區
    cout<<"字符串常量的地址為:"<< &"hello world s1" <<endl;
    cout<<"字符串常量的地址為:"<< &"hello world s2" <<endl<<endl;
    cout<<"堆區"<<endl;
    //new 堆區
    int* new_a=new int(10);
    int* new_b=new int(20);
    cout<<"堆區變量 new_a 的地址為:"<< new_a <<endl;
    cout<<"堆區變量 new_a 的地址為:"<< new_b <<endl<<endl;
    return 0;
}

運行結果分析如下:

原文鏈接:https://blog.csdn.net/weixin_44751255/article/details/126772927

欄目分類
最近更新