首页 > 系统相关 >【C++】内存分区模型 - 内存四区

【C++】内存分区模型 - 内存四区

时间:2024-07-12 23:56:17浏览次数:22  
标签:常量 int 四区 代码 C++ 内存 new 链接

补充内容:

c++编译过程:编译预处理、编译优化、汇编、链接

①编译预处理:处理以“#”开头的指令,产生“.i”文件;【如头文件、define宏定义等】

②编译优化:将源码".cpp"文件翻译成“.s”汇编代码;【如词法语法语义分析,代码优化等】

③汇编:将汇编代码“.s”翻译成机器指令“.o”或".obj"目标文件【汇编后的.o文件是纯二进制文件】

④链接:产生“.out"或".exe"可运行文件【分为动态链接(.dll/.so)和静态链接(.lib/.a)】

区别:

静态链接是 将各个模块的obj和库链接成一个完整的可执行程序;而动态链接是程序在运行的时候寻找动态库的函数符号(重定位),即DLL不必被包含在最终的exe文件中

优缺点:

静态链接:浪费空间,每个可执行程序都会有目标文件的一个副本,这样如果目标文件进行了更新操作,就需要重新进行编译链接生成可执行程序(更新困难);优点就是执行的时候运行速度快,因为可执行程序具备了程序运行的所有内容。

动态链接:节省内存、更新方便,但是动态链接是在程序运行时,每次执行都需要链接,相比静态链接会有一定的性能损失。

--------

c++程序执行时,内存分为四个区域

一、程序运行前:在程序编译后,生成exe可执行程序,未执行该程序前分为两个区域

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

                1、存放CPU执行的机器指令【将程序员写的代码转化为 0101的二进制形式】

                2、代码区的特点:

                        2.1、代码区是共享的,目的是对于频繁被执行的程序,只需要在内存中有一份 代                                   码【比如需要双击打开这个程序,一份执行代码即可多次执行】

                        2.2、代码区是只读的,防止程序意外修改exe的指令

        ②全局区:存放全局变量、静态变量、常量

                1、全局区内包含了常量区,常量区内有字符串常量和其他常量【const修饰的变量】

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

                

                【由图可看见,局部变量和全局变量不在同一个存储段中】

                ** 普通变量前加static 属于静态变量 【int a】→【static int a】**

                ** 字符串常量和const修饰的全局常量 都存在全局区中 **

                ** 局部变量和const修饰的局部常量 并不在全局区中 **【有局部的都不在全局区中】

二、程序运行后:

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

        ** 不要返回局部变量的地址 **

        如果用指针去操作这一块内存,第一次可以正常操作,因为编译器会怕你误操作帮你保留内容;但是第二次操作数据就不再会保留,操作就会失误。此时属于非法操作。

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

        c++中利用new关键字在堆区中开辟内存【int * p  = new int(10),用指针接收new开辟的地址】

        

        ** 用栈存储堆区的地址编号,在堆区中存储数据内容 ** 【指针属于局部变量,该方法可解决第三点中的非法操作】

三、new操作符

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

语法:new 数据类型

** new返回的是该数据类型的指针 **

//数据类型 * p = new 数据类型(数据);

int * func()
{
    int * p = new int(10);
}

int main(){
    
    int * p =func();
    cout << *p << endl;

    //手动释放
    delete p;

}

** 在堆区里利用new开辟数组 ** 利用中括号创建数组

void test(){

    int * arr = new int[10]; //10代表数据有10个元素

    for(int i = 0; i<10; i++){
    
        arr[i] = i+100; // 赋值100~109
    
    }

    for(int i = 0; i<10; i++){
    
       cout << a[i] << endl;
    
    }

    delete[] arr;        //释放时要加上中括号,告诉其释放的是数组而不是一个数据

}

标签:常量,int,四区,代码,C++,内存,new,链接
From: https://blog.csdn.net/weixin_60546365/article/details/140364569

相关文章

  • 南外c++集训枚举题:关灯
    根据标题可知这道题一定是一道枚举题这道题考虑使用dfs,处理特殊处理第一层,每次加答案时选最优值。给出代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,m;charmat[20][110];intdfs(intcnt,intpos,inttmp)//cnt:楼层pos:哪里的楼梯tmp走到楼梯......
  • 2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。A.1B.2C.3D.4答案:C第2......
  • 内存管理-18-sparsemem内存模型-初探
    一、简介Linux中的物理内存被按页框划分,每个页框都会对应一个structpage结构体存放元数据,也就是说每块页框大小的内存都要花费sizeof(structpage)个字节进行管理。因此系统会有大量的structpage,在linux的历史上出现过三种内存模型去管理它们。依次是平坦内存模型(flatm......
  • 嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)
    1.项目概述本项目旨在开发一套先进的智能工厂设备监控系统,集成嵌入式技术、工业通信协议和人机界面等多项技术,实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率,大幅降低维护成本,并为管理层决策提供可靠的数据支持。主要功......
  • c++学习
    20240712最近开始看候捷的c++视频,视频是从类开始讲的,过程中发现很多c的知识有点忘了,而且c++也有很多新的语法特性。因此看完前几个视频后花点时间过一下c++primer前六章,记录一下需要学习的c++新特性和代码规范。学引用时有点乱,抽时间搞一下值类型的总结#第二章基本类型lon......
  • C++中的多态
    抽象类概念在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。......
  • C++中的引用
        在C++中,我们要学习一个新的概念,叫做引用。引用不是对象,它只是给变量取一个别名。就好比,我们每个人总会右一下外号,或者是小名。当朋友或者家长不管是直接叫你的名字,还是叫你的小名,你都会答应。引用的概念和定义    引用不是定义一个新变量,而是给已存在的......
  • #第3课C++的变量与输入(cin)
    上一节课我们学习了输出(cout),这节课我们将要学习变量与输入,而这些都需要搭配昨天的输出来写,所以昨天的课很重要,不太扎实的同学请看上一讲。在学习今天的课之前我们先来认识几个变量类型:  具体类型字节长度取值范围   int4字节(32位)       -2147483648......
  • c++参数包展开和折叠表达式
    template<typenameT>voidfun2(Tt){cout<<t<<endl;}//利用逗号表达式和初始化列表展开template<typename...Arg6>voidfun1(Arg6...args){intarr[]={(fun2(args),0)...};}template<typenameT>intfunc3Imp(T&&t......
  • 在C++中使用gRPC框架
    概览在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同机器上的服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包括参数和返回类型)。在服务器端实现这个接口,并运行一个gRPC......