首页 > 系统相关 >cpp 内存分区模型

cpp 内存分区模型

时间:2024-04-10 16:34:00浏览次数:25  
标签:10 释放 const 常量 int 分区 存放 内存 cpp

c++程序在执行前,将内存大方向划分为4个区域。

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

2.全局区:存放全局变量和静态变量以及常量

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

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

不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程。

程序运行前,生成了exe可执行程序,未执行该程序前分为两个区域

1代码区:

​ 存放 CPU 执行的机器指令

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

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

2.全局区:

全局变量和静态变量、字符串常量、全局常量存放在这

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

#include <iostream>
using namespace std;
int ga=10;
int gb=20;
const int gca=2222;
const int gcb=3333;
int main() {
    int a=10;
    int b=20;

    static int sa=10;
    static int sb=20;

    const int ca=2222;
    const int cb=3333;
    cout<<"全局变量"<<endl;
    cout<<&ga<<endl;
    cout<<&gb<<endl;
    cout<<"全局常量"<<endl;
    cout<<&gca<<endl;
    cout<<&gcb<<endl;
    cout<<"局部变量"<<endl;
    cout<<&a<<endl;
    cout<<&b<<endl;
    cout<<"静态局部变量"<<endl;
    cout<<&sa<<endl;
    cout<<&sb<<endl;
    cout<<"局部常量"<<endl;
    cout<<&ca<<endl;
    cout<<&cb<<endl;
    return 0;
}

运行结果如下:

可以看出,局部常量和局部变量都是在栈区分配的,符合先进后出原则。

  • C++中在程序运行前分为全局区和代码区
  • 代码区特点是共享和只读
  • 全局区中存放全局变量、静态变量、常量
  • 常量区中存放 const修饰的全局常量 和 字符串常量

程序运行后

栈区:

由编译器分配和释放,存放函数的参数值和局部变量

堆区:

由程序员分配释放,若程序员不释放,程序结束后由操作系统释放,在cpp中主要由new关键字开辟内存,利用delete释放内存。

利用new创建的数据,会返回该数据对应的类型的指针

//堆区开辟数组
int main() {

	int* arr = new int[10];

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}

	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	//释放数组 delete 后加 []
	delete[] arr;

	system("pause");

	return 0;
}

标签:10,释放,const,常量,int,分区,存放,内存,cpp
From: https://blog.csdn.net/qq_41325698/article/details/137599183

相关文章

  • Win11开机内存占用高的解决办法。
    我自己本身的配置是双16G的,升级完win11以后,开机没有打开任何软件,发现内存占用达到25%,7.9个G。 解决办法: 使用windows内存诊断工具可以降一部分。 快捷键win+r 输入 mdsched 选择第一个,立即重新启动。接下来的画面: 可以让开机内存减小。亲测暂时生效,后续再看......
  • Java IO与NIO-Java内存管理-Java虚拟机(JVM)-Java网络编程-Java注解(Annotation)
    JavaIO与NIO:请解释Java中的IO(Input/Output)和NIO(NewInput/Output)的区别是什么?它们各自的优势是什么?答案:Java中的IO是基于流(Stream)的方式进行输入输出操作,而NIO则是基于通道(Channel)和缓冲区(Buffer)的方式进行输入输出操作。NIO相比于IO具有非阻塞IO、选择器(Selector)和内存映......
  • 54、C++内存模型
    在 C++ 中,程序运行时,内存主要分成四个区,分别是栈、堆、数据段和代码段。                栈:存储局部变量、函数参数和返回值。堆:存储动态开辟内存的变量。数据段:存储全局变量和静态变量。代码段:存储可执行程序的代码和常量(例如字符常量),此存储区不可修......
  • 电脑硬件 - 内存
    内存,是一台电脑的CPU与硬盘间数据交互的中转站。不稳定的内存时常会导致蓝屏,黑屏,死机,甚至电脑无法亮机。在电脑工作中,CPU和硬盘间无时无刻地进行着大量的数据交互。为了保证软件流畅正常运行,会在中间加一个内存。 在工作时,金手指会与内存插槽内部的触点接触,若金手指接触不......
  • Agent内存马分析
    什么是JavaAgent我们知道Java是一种强类型语言,在运行之前必须将其编译成.class字节码,然后再交给JVM处理运行。JavaAgent就是一种能在不影响正常编译的前提下,修改Java字节码,进而动态地修改已加载或未加载的类、属性和方法的技术。实际上,平时较为常见的技术如热部署、一些诊断工......
  • C语言进阶之动态内存管理【概念篇】
    前言:我们知道C语言是一门接触底层的语言,其核心用法之一就是对内存的操作,本篇将就详细介绍C语言中是如何灵活开辟内存空间的以及如何管理使用这些空间等等。一.为什么要引入动态内存管理 ? 在C语言中我们目前已经掌握两种开辟内存空间的方式:1.intdata=10;//在栈(stack)空......
  • CSCI 2122任缓存和内存层次结构 解析
    CSCI2122任务5截止日期:2024年4月9日星期二晚上11:59,通过git提交目标本课业的目的是练习用C进行编码,并强化中讨论的概念类的指针、缓存和内存层次结构。在这项任务中,您将实现一个使用有限内存的缓存模拟器。准备1.完成工作分配0,或确保已安装完成工作分配所需的工具。2.克隆......
  • 操作系统综合题之“分页存储系统,逻辑地址和页号和页框号位数? 和 给内存访问速度计算
    一、问题:某系统采用基本分页存储管理方式,逻辑地址空间为32页,每页2KB,物理地址空间位1MB,请回答以下问题1.逻辑地址有多少位?其中页号占多少位?2.系统的页框号有多少位3.如果CPU访问内存的速度为0.2us,那么有效访存时间为多少?4.如果采用快表,假设在快表中找到页表项的概率为90%,且查快......
  • node内存溢出
    npmrunserve启动vue项目时发现node出现内存泄露报错如下:FATALERROR:Ineffectivemark-compactsnearheaplimitAllocationfailed-JavaScriptheapoutof...解决办法如下:在项目文件路径中运行此命令在当前的命令窗口设置Node临时环境变量,这样做的好处是不需要关心p......
  • android 内存优化
    什么是内存泄漏?如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄漏。在Android开发中,一些不好的编程习惯会导致我们的开发的app存在内存泄漏的情况。下......