程序执行内存区域,堆栈使用及区别

文章目录

  • 一、程序执行内存区域
  • 二、堆区详解
  • 三、栈内存与堆内存的区别
  • 总结


一、程序执行内存区域

在这里插入图片描述

**代码区:**当我们的程序被执行时,它会有一个加载准备的过程。其中函数及内部的流程结构代码指令会被放到代码区中,等待着被调用执行。

**常数区:**字符串常量、const 全局变量在程序启动加载时会放置在常数区,被放置在此区域的数据不可被修改,只能读取。

全局区/静态区: 全局变量和代码中的静态变量会在程序启动执行时被加载到此区域。此区域的变量空间只有程序结束关闭后才会被释放。

栈区: 当函数被调用时,其内部的形参、函数内的其它局部变量会被创建在栈区。当函数被调用结束后,配合函数的局部变量就会被操作系统自动释放回收。

堆区: 堆区是由程序员自主管理的内存空间,可以通过 malloc 等函数在堆区内存中申请需要的任意大小的内存空间。但当此内存空间不打算继续使用时,务必使用 free 函数释放掉这些空间,否则在程序关闭以前,这些内存空间是不会被其它程序所使用的,会造成很大的空间浪费甚至宕机。直到程序被关闭后没有手动释放的空间才会被操作系统回收。

二、堆区详解

堆(heap)内存是由程序员根据程序的需要而自行申请的内存空间。堆内存给了程序员极大的自主性使用一片内存空间。但是当程序不需要这个空间时需要及时自行释放申请的堆内存空间。
申请方式(三种):

  1. malloc 函数用于向堆内存空间申请一片指定字节数量的内存空间,其参数是需要的字节总数量。
    free 函数用于释放掉不使用的堆内存空间。
  2. 还可以用 calloc 函数来实现。其声明语法为:void*calloc(size_t count,size_t,size);
    其中第一个参数代表数据成员总数量,第二个参数代表其中一个数据成员所需的空间大小。
  3. 如果当前的内存空间不够用,想要扩展一下大小。可以使用 realloc 函数。
    realloc函数的第一个参数是现有的数据在堆的内存空间地址,第二个参数是扩容后最终空间的总大小。realloc会根据扩容的情况进行空间的处理。如果现有空间的后续空间没有被使用且能够容纳所需的扩容,就在这个基础上扩充。如果不能,就会在堆内存中寻找一段能容纳我们要求大小的新的内存空间,再把现有的内容复制到新的空间,并返回新空间的地址。

malloc 与 calloc 在创建类似数组空间的区别。表面上是参数不同,malloc 需要计算总的空间大小,calloc 则分开设置数量与单个的大小。还有个区别是 calloc 具有空间初始化清零的功能

三、栈内存与堆内存的区别

在这里插入图片描述
1、 分配方式与分配效率不同:当函数被调用执行时,其形参与函数体内的局部变量会一起在栈区内全部被创建出来,而堆内存的空间分配是 malloc、calloc 等函数被执行时才会分配空间。从分配效率上讲栈内存高于堆内存。
2、 存储内容不同:堆内存更适用于存储数据量较大的情况,而栈内存更适合存储临时少量的数据。如果函数之间共享一个数据结构(比如链表),那么比较好的处理是把这个数据结构存储在堆内存,栈内存掌握这个堆空间的指针即可,这样就避免了栈空间频繁的创建与回收带来的开销。
3、 管理方式不同:栈内存空间是由操作系统支持管理的,堆内存需要开发者自行维护——创建与回收。如果开发者疏忽了回收就会产生垃圾内存。所以堆内存是容易产生内存碎片的,栈内存由于系统自动维护则不会产生内存碎片。
4、 生长方向与空间大小不同:栈与堆的内存空间都是动态延展的,但它们是相对方向的。栈的内存空间要小于堆的内存空间,所以堆内存空间更适合存储大一些的数据量。


总结

内存管理是一门很重要的学问,感兴趣可以通过侯捷老师的内存管理机制课程深入学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JS】基于React的Next.js环境配置与示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍基于React的Next.js环境配置与示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…

【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络

课题名称:基于自适应SPREAD-PNN的乳腺肿瘤诊断分类及预测 版本日期:2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院经过多年的收集和整理&…

【python】cffi 在 Python 代码中调用 C 代码

cffi(C Foreign Function Interface)是 Python 中的一个库,它提供了一种在 Python 代码中调用 C 代码的方法。通过 cffi,你可以编写 Python 代码来直接使用 C 函数、调用共享库(.so 或 .dll 文件)&#xff…

笔记---求组合数

总&#xff1a; ①10w次询问——1 < b < a < 2000——递推求—— N N N2 ②1w次询问——1 < b < a < 105——公式求—— N l o g N NlogN NlogN ③20次询问——1 < b < a < 1018——Lucas定理 ④1次询问——1 < b < a < 5000——拆分质因子…

【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解

目录 2.6 双端队列1) 概述2) 链表实现3) 数组实现习题E01. 二叉树 Z 字层序遍历-Leetcode 103 2.6 双端队列 1) 概述 双端队列、队列、栈对比 定义特点队列一端删除&#xff08;头&#xff09;另一端添加&#xff08;尾&#xff09;First In First Out栈一端删除和添加&…

普渡机器人CEO预测2024年服务机器人市场将扩大

原创 | 文 BFT机器人 根据普渡科技有限公司的报告&#xff0c;商用服务机器人在东亚地区的应用比其他地方更为广泛。然而&#xff0c;预计到2024年&#xff0c;全球其他地区也将迎头赶上。这家总部位于中国深圳的公司自豪地宣称&#xff0c;它已经成为中国最大的此类机器人出口…

基于微信小程序的书籍阅读系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Unity知识点详解】自定义程序集

今天来介绍一下Unity中的自定义程序集。在项目开发中我们经常接触到第三方插件的程序集&#xff0c;如DOTween、Newtonsoft.Json等。 使用自定义程序集有这么几个好处&#xff1a; 方便代码的的复用。当某一功能模块需要在多个项目中重复使用时&#xff0c;可以将代码编译成程…

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

【数据结构与算法】(5)基础数据结构之队列 链表实现、环形数组实现详细代码示例讲解

目录 2.4 队列1) 概述2) 链表实现3) 环形数组实现 2.4 队列 1) 概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#xff0c;添加的一端称为尾&#xff0c;移除的一端称为头&#xf…

安装配置Oracle 11g 、PLSQL及使用Navicat远程连接Oracle

目录 一、下载 二、安装 1.执行安装程序 2.配置安全更新 3.安装选项 4.系统类 5.网络安装选项 6.选择安装类型 7.选择产品语言 8.选择数据库版本 9.指定安装位置 10.选择配置类型 ​编辑11.指定数据库标识符 12.指定配置选项 13.电子邮箱 14.指定数据库存储…

自学Java的第十九天

一&#xff0c;每日收获 1.排序 2.冒泡排序法 3.查找 4.多维数组-二维数组 二&#xff0c;新名词与小技巧 三&#xff0c;今天学习中所遇到的困难 一&#xff0c;每日收获 1.排序 ① 排序的介绍 排序是将多个数据&#xff0c;依指定的顺序进行排列的过程。 ② 排序的…

学习c语言,动态内存管理

malloc和calloc区别在于初始化 realloc动态内存

前端如何预防CSRF

①阻⽌不明外域的访问&#xff1a; 同源检测 、Samesite Cookie ②提交时要求附加本域才能获取的信息&#xff1a; CSRF Token 、双重Cookie验证 1、同源检测 既然CSRF⼤多来⾃第三⽅⽹站&#xff0c;那么我们就直接禁⽌外域&#xff08;或者不受信任的域名&#xff09;…

网课:[CQOI2009]中位数图——牛客(疑问)

涉及知识点&#xff1a;已知中位数的题的一般思路 题目描述 给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 输入描述: 第一行为两个正整数n和b &#xff0c;第二行…

【从单张图像解锁深度信息】Depth Anything一种用于鲁棒单目深度估计的高度实用的解决方案

Depth Anything是一种用于鲁棒单目深度估计的高度实用的解决方案。 在不追求新颖的技术模块的情况下,我们的目标是建立一个简单而强大的基础模型,处理任何情况下的任何图像。 为此,我们通过设计数据引擎来收集并自动注释大规模未标记数据(~62M)来扩展数据集,这显着扩大了…

Axure详细介绍

1. 元件基本介绍 2. 基础元件的使用 3. 表单型元件的使用 4. 菜单与表格元件的使用 使用&#xff1a;如果想使用某个元件&#xff0c;我们只需要将它从元件库中拖入画布摆放即可。 - 对齐&#xff1a;默认情况下&#xff0c;两个矩形元件并排摆放&#xff0c;中间的边框为两…

web前端-------弹性盒子(2)

上一讲我们谈的是盒子的容器实行&#xff0c;今天我们来聊一聊弹性盒子的项目属性&#xff1b; *******************&#xff08;1&#xff09;顺序属性 order属性&#xff0c;用于定义容器中项目的出现顺序。 顺序属性值&#xff0c;为整数&#xff0c;可以为负数&#xff…

小周学JAVA—八股六

自动装箱和拆箱 Java中基础数据类型与它们对应的包装类见下表&#xff1a; 原始类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble 装箱&#xff1a;将基础类型转化为包装类型。 拆箱&#xff1a;将包装类型转化为基础类…

c语言之逻辑运算符

逻辑运算符分别是“与”&#xff0c;“或”&#xff0c;“非” 表示与的是&& 表示或的是|| 表示非的是! 比如说有条件a和b&#xff0c;a&&b只有全是真时才是真&#xff0c;有一个是假&#xff0c;则为假。 a真&#xff0c;b真&#xff0c;a&&b为真 …