C++——内存分区模型

一、内存分区模型

  代码区:存放函数体的二进制代码,有操作系统进行管理的

    存放CPU执行的机器指令

    代码区是共享的,共享的目的是对频繁被执行的程序,只需要在内存中有一份代码即可

    代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令 

  全局区:存放全局变量和静态变量以及常量,其中常量区存放const修饰的全局常量和字符串常量

    全局变量和静态变量存放在此

    全局区还包括了常量区,字符串常量和其他常量也存放在此

    该区域的数据在程序结束后由操作系统释放

  栈区:由编译器自动分配释放,存放函数的参数值,局部变量

      注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

  堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

     new操作符  

    c++中利用new操作符在堆区开辟数据

    堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete

二、引用

  引用的基本使用→作用:给变量起别名

    语法:数据类型 &别名 = 原名

    引用的注意事项:引用必须初始化、引用在初始化后,不可以改变

      注意:  int &c = a;  → 初始化; int &c  = d; → 错误的,初始化后,不可改变; c = b; → 此处是赋值操作,不是更改引用

  引用做函数参数

    引用传递,形参会修饰实参的

  引用做函数返回值

    作用:引用是可以作为函数的返回值存在的

      注意:不要返回局部变量引用

C++------内存分区模型

 1 // 不要返回局部变量的引用
 2 int &test01()
 3 {
 4     int a = 10; // 局部变量存放在栈区
 5     return a;
 6 }
 7 
 8 int main()
 9 {
10     int &ref = test01();
11     
12     cout << "ref = " << ref << endl; // 第一次结果正确,是因为编译器做了保留
13     cout << "ref = " << ref << endl; // 第二次结果错误,因为a的内存已经释放
14     /*输出结果: ref = 10       ref = 1657912288*/
15 }

返回局部变量的演示

           函数的调用可以作为左值

C++------内存分区模型

 1 int &test01()  // 引用函数
 2 {
 3     static int a = 10; // 静态变量,存放在全局区,全局区中的数据在程序结束后系统释放
 4     return a;
 5 }
 6 
 7 int main()
 8 {
 9     int &ref = test01();  // 此处 &ref 初始化后,成为函数a的别名
10     
11     cout << "ref = " << ref << endl; 
12         test01() = 1000; // 该处是对函数中的 返回值 a重新赋值
13     
14     cout << "ref = " << ref << endl;  // 此处 ref 作为a 的别名,输出的值也是与返回值a相等,test01() 引用函数返回值改变a 改变 ref 随之改变
15     /*输出结果:ref = 10     ref = 1000*/

函数调用可以作为左值

 

原文链接: https://www.cnblogs.com/evething-begins-with-choice/p/12949061.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++------内存分区模型

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350494

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:21
下一篇 2023年3月2日 上午6:21

相关推荐