内存分区模型(代码区、全局区、栈区、堆区)

简介: 内存分区模型(代码区、全局区、栈区、堆区)

从这开始c++开始了进阶学习!!

c++程序执行时,将内存划分4个区域

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

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

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

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

内存四区的意义:

不同区域存放的数据,赋予不同的生命周期

1.1 程序执行前

说明:在程序编译后,生成了exe可执行程序,未执行程序前分为两个区域

代码区:
  • 存放CPU执行的机器指令(二进制代码)
  • 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
  • 代码区也是只读的,使其只读的原因是防止程序意外地修改了他的指令
全局区:
  • 全局变量和静态变量存放在此
  • 全局区还包含了常量区,字符串常量和其他常量也存放在此
  • 该区域的数据在程序结束后由操作系统释放
#include<iostream>
#include<string>
using namespace std;
//全局变量
int g_a = 10, g_b = 10;
//const修饰的全局变量
const int c_g_a = 10;

int main()
{
  system("color 5E");
  //局部变量
  int a = 10, b = 10;
  cout << "局部变量a的地址为:" << int(&a) << endl;
  cout << "局部变量b的地址为:" << int(&b) << endl;
  cout << "全局变量g_a的地址为:" << int(&g_a) << endl;
  cout << "全局变量g_b的地址为:" << int(&g_b) << endl;
  //静态变量,在普通变量前面加static,属于静态变量
  static int s_a = 10;
  static int s_b = 10;
  cout << "静态变量g_b的地址为:" << int(&s_a) << endl;
  cout << "静态变量g_b的地址为:" << int(&s_b) << endl;
  //字符串常量
  cout << "字符串常量的地址为:" << int(&"helll" )<< endl;

  //const修饰的变量
  //const修饰的全局变量,修饰的局部变量
  const  int c_a = 10;
  cout << "const修饰的全局变量:" << int(&c_g_a) << endl;
  cout << "const修饰的局部变量:" << int(&c_a) << endl;
  return 0;
}

1.2 程序运行后
栈区:

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

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

#include<iostream>
#include<string>
using namespace std;
int * func()
{
  int a = 10;//局部变量,存放在栈区
  return &a;//返回局部变量地址
}
int main()
{
  system("color 5E");
  int *p = func();//用指针接收函数的返回值
  cout << *p << endl;//第一次打印正确数字,是因为编译器做了保留,防止误操作
  cout << *p << endl;//第二次不会保留
  return 0;
}

结果说明:(1)第一次打印正确数字,是因为编译器做了保留,防止误操作;(2)第二次不会保留

堆区:

由程序员分配释放,若程序员不释放,程序结束后自动释放,C++中主要利用new在堆区开辟内存,然后把数据保存在堆区,指针地址还保存在栈区

#include<iostream>
#include<string>
using namespace std;

int * func()
{
  //利用new关键字,可以把数据开辟到堆区
  //指针本质也是局部变量,放在栈区,指针保存的数据放在堆区
  int * p=new int(10);
  return p;
} 
int main()
{
  system("color 5E");
  int *p = func();
  cout << *p << endl;
  cout << *p << endl;
  cout << *p << endl;
  cout << *p << endl;
  return 0;
}

1.3 new操作符

作用:C++中利用new操作符在堆区开辟数据。堆区开辟数据,由程序员手动开辟和释放,释放数据利用操作符delete

语法:new 数据类型

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

#include<iostream>
#include<string>
using namespace std;

int * func()
{
  //在堆区创建整型数据
  //new返回该数据类型的指针
  int * p=new int(100);
  return p;
} 
void test01()
{
  int *p = func();
  cout << *p << endl;
  cout << *p << endl;
  cout << *p << endl;
  //堆区的数据由程序员开辟、释放
  //若要释放堆区的数据
  delete p;
  //cout << *p << endl;//非法操作
}
//2、在堆区利用new开辟数组
void test02()
{
  //创建整型的数组,在堆区
  int *arr = new int[10];
  for (int i = 0; i < 10; i++)
  {
    arr[i] = i;
  }
  for (int i = 0; i < 10; i++)
  {
    cout << arr[i] << " ";
  }
  //释放堆区数组
  //释放数组的时候,加上[]
  delete[] arr;
  //cout << arr[1] << endl;//释放之后就不能再调用,调用会报错“非法操作”
}
int main()
{
  system("color 5F");
  test01();
  test02();
  return 0;
}


相关文章
|
2月前
|
Java 大数据 Go
从混沌到秩序:Java共享内存模型如何通过显式约束驯服并发?
并发编程旨在混乱中建立秩序。本文对比Java共享内存模型与Golang消息传递模型,剖析显式同步与隐式因果的哲学差异,揭示happens-before等机制如何保障内存可见性与数据一致性,展现两大范式的深层分野。(238字)
70 4
|
4月前
|
人工智能 边缘计算 自然语言处理
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
随着模型量化技术的发展,大语言模型(LLM)如今可在低配置设备上高效运行。本文介绍本地部署LLM的核心技术、主流工具及十大轻量级模型,探讨如何在8GB内存环境下实现高性能AI推理,涵盖数据隐私、成本控制与部署灵活性等优势。
1902 0
普通电脑也能跑AI:10个8GB内存的小型本地LLM模型推荐
|
9月前
|
存储 人工智能 编解码
TripoSF:3D建模内存暴降80%!VAST AI新一代模型细节狂飙82%
TripoSF 是 VAST AI 推出的新一代 3D 基础模型,采用创新的 SparseFlex 表示方法,支持 1024³ 高分辨率建模,内存占用降低 82%,在细节捕捉和复杂结构处理上表现优异。
269 10
TripoSF:3D建模内存暴降80%!VAST AI新一代模型细节狂飙82%
|
10月前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
500 4
|
12月前
|
人工智能 物联网 C语言
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
SVDQuant是由MIT研究团队推出的扩散模型后训练量化技术,通过将模型的权重和激活值量化至4位,显著减少了内存占用并加速了推理过程。该技术引入了高精度的低秩分支来吸收量化过程中的异常值,支持多种架构,并能无缝集成低秩适配器(LoRAs),为资源受限设备上的大型扩散模型部署提供了有效的解决方案。
727 5
SVDQuant:MIT 推出的扩散模型后训练的量化技术,能够将模型的权重和激活值量化至4位,减少内存占用并加速推理过程
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
281 5
|
存储
栈内存
栈内存归属于单个线程,也就是每创建一个线程都会分配一块栈内存,而栈中存储的东西只有本线程可见,属于线程私有。 栈的生命周期与线程一致,一旦线程结束,栈内存也就被回收。 栈中存放的内容主要包括:8大基本类型 + 对象的引用 + 实例的方法
147 1
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
3771 5
|
5月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1759 0
|
5月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
499 1

热门文章

最新文章