【2021-07-27】C++核心编程之内存分区模型

C++核心编程

内存分区模型

C++程序在执行时,将内存在大方向上分为4个区域,不同区域存放不同的数据,赋予不同的生命周期,提高了编程的灵活性。

  • 堆区
    由程序员进行分配和释放,若程序员不进行释放,在程序结束时,由操作系统进行回收
  • 栈区
    由编译器自动分配和释放,存放函数的参数值和局部变量等
  • 代码区
    存放函数的二进制代码,由操作系统进行管理
  • 全局区
    存放全局变量、静态变量以及常量(指字符串常量和全局常量),局部变量和局部常量均不在全局区中
    验证代码如下:
    #include <iostream>
    #include <string>
    using namespace std;
    /*c-const 常量 ,g-global 全局 ,l-local局部 s-static 静态
    变量、常量
    全局、局部
    静态、动态(普通)
    */

    //全局普通变量
    int g_a = 0, g_b = 1;

    //全局普通常量
    const int c_g_a = 2, c_g_b = 3;

    //全局静态变量
    static int s_g_a = 4, s_g_b = 5;

    //全局静态常量
    static const int s_c_g_a = 6, s_c_g_b = 7;

    int main()
    {
	    //局部普通变量
	    int l_a = 0, l_b = 1;

	    //局部普通常量
	    const int c_l_a = 2, c_l_b = 3;

	    //局部静态变量
	    static int s_l_a = 4, s_l_b = 5;

	    //局部静态常量
	    static const int s_c_l_a = 6, s_c_l_b = 7;

	    cout << "全局普通变量g_a、g_b的地址分别为" << &g_a << "、" << &g_b << endl << endl;
	    cout << "全局普通常量c_g_a、c_g_b的地址分别为" << &c_g_a << "、" << &c_g_b << endl << endl;
	    cout << "全局静态变量s_g_a、s_g_b的地址分别为" << &s_g_a << "、" << &s_g_b << endl << endl;
    	cout << "全局静态常量s_c_g_a、s_c_g_b的地址分别为" << &s_c_g_a << "、" << &s_c_g_b << endl << endl;

	    cout << "局部普通变量l_a、l_b的地址分别为" << &l_a << "、" << &l_b << endl << endl;
	    cout << "局部普通常量c_l_a、c_l_b的地址分别为" << &c_l_a << "、" << &c_l_b << endl << endl;
	    cout << "局部静态变量s_l_a、s_l_b的地址分别为" << &s_l_a << "、" << &s_l_b << endl << endl;
        cout << "局部静态常量s_c_l_a、s_c_l_b的地址分别为" << &s_c_l_a << "、" << &s_c_l_b << endl << endl;

	    return 0;
    }

    /*
    输出结果: 

    全局普通变量g_a、g_b的地址分别为006CC140、006CC038

    全局普通常量c_g_a、c_g_b的地址分别为006C9BF8、006C9BFC

    全局静态变量s_g_a、s_g_b的地址分别为006CC03C、006CC040

    全局静态常量s_c_g_a、s_c_g_b的地址分别为006C9C00、006C9C04

    局部普通变量l_a、l_b的地址分别为007DFD08、007DFCFC

    局部普通常量c_l_a、c_l_b的地址分别为007DFCF0、007DFCE4

    局部静态变量s_l_a、s_l_b的地址分别为006CC044、006CC048

    局部静态常量s_c_l_a、s_c_l_b的地址分别为006C9C08、006C9C0C
    */  
  1. 程序运行前
    程序经过编译后,生成了.exe的可执行程序,在该程序未执行前,内存分为两个区域
  • 代码区
    • 存放CPU执行的机器指令
    • 代码区是共享的,对于频繁被执行的代码,只需要在内存中保存一份代码即可
    • 代码区是只读的,防止程序意外修改其指令
  • 全局区
    • 保存全局变量、静态变量
    • 全局区还包含常量区,保存字符串常量和全局常量
    • 全局区的数据在程序结束后由操作系统释放
  1. 程序运行后
  • 栈区
    • 由编译器自动分配和释放,用于存放函数的参数值和局部变量等
    • Tip:不要返回局部变量的地址,栈区开辟的数据会由编译期自动释放
  • 堆区
    • 由程序员进行分配和释放,若程序员不进行释放,在程序结束时,由操作系统进行回收
    • 在C++中主要利用new关键字在堆区开辟内存,delete关键字释放内存
      测试代码如下
    #include <iostream>
    using namespace std;
    int main()
    {
	    int* ptr = new int(10);
	    cout << "指针变量ptr的地址为:" << &ptr << endl;
	    cout << "指针变量ptr指向(存储)的地址为:" << ptr << endl;
	    cout << "指针变量ptr所指向(存储)的地址中保存的数据为:" << *ptr << endl;
	    return 0;
    }
    /*  
    输出:
    指针变量ptr的地址为:006FFDE8
    指针变量ptr指向(存储)的地址为:00C32838
    指针变量ptr所指向(存储)的地址中保存的数据为:10
    */

由此可见,指针变量存在栈区,而其指向的地址存在堆区。

感谢黑马程序员C++相关课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值