前言:我们经常听到一个概念,堆和栈。实际上,数据结构中有两个相同的概念,但这与内存堆栈不同。本文还将说明它们之间的区别,此内。函数完成后,这些内容将被自动销毁。 。它的特点是效率高,但内存大小有限。

(4)堆区域--------由malloc和calloc分配的内存区域,其生命周期由free确定。堆的内存大小由程序员分配,理论上可以占据系统的所有内存。

这四个类别如下:

个人喜好,对这四个类别有更好的了解。请注意.bss .data在这里的含义。

摘要:

1. 5函数调用存储在堆栈存储器中后的返回地址

调用该函数时,将使用指向该函数的指针来指向该函数。函数返回时,它将返回到调用位置,该位置是函数调用结束后的返回地址。

此外,返回地址存储在堆栈中。首先调用的函数首先放在堆栈上,然后最后弹出,然后最后调用的函数放在堆栈上,然后首先弹出。

二、关于内存堆栈(内存堆栈)

2. 1堆栈溢出

程序自动将“堆栈”分配并回收给操作系统。它既快速又易于使用,但是不能由程序员控制。但是堆栈空间很小。只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存。如果要分配的空间大于堆栈内存,分配将失败并提示堆栈溢出错误。

#include int main()

{

int i = 10; //变量i储存在栈区中

const int i2 = 20; //const局部变量也存储在stack

int i3 = 30;

std::cout << &i << " " << &i2 << " " << &i3 << std::endl;

return 0;

}

/*运行结果为:

0x28fedc  0x28fed8 0x28fed4  16进制地址,递减的

*/

注意:const局部变量也存储在堆栈区域中,并且堆栈区域沿地址递减的方向增长。

2. 2堆栈的特征

([1)应用程序大小限制

在Windows下,堆栈是一个扩展到低位地址的数据结构,是内存的连续区域。这句话意味着系统顶部将确定堆栈顶部的地址和堆栈的最大容量。在Windows下,堆栈的大小为2M(有人说是1M,简而言之,这是在编译时确定的常数),如果当请求的空间超过堆栈的剩余空间时,将提示溢出。因此,堆栈中可用的空间较小。

([2) Stack应用程序的效率很高

系统自动分配堆栈,速度更快。但是程序员没有控制权,结束后它将由操作系统释放。

([3)堆栈使用过程

当堆栈处于函数调用中时,

此函数调用结束时,局部变量首先从堆栈中弹出,然后是参数,最后是堆栈顶部的指针指向最初存储的地址,这是存储区中的下一条指令。主要功能,此后程序将继续运行。

三、关于内存堆(内存堆)

3. 1堆溢出

堆是一个扩展到更高地址的数据结构,并且是一个不连续的存储区域。这是因为系统使用链表存储空闲内存地址,这自然是不连续的。链表的遍历方法是从低地址到高地址,并且堆的大小受计算机系统中有效内存的限制。可以看出,堆获得的空间相对灵活,相对较大。

程序员向操作系统申请一块内存。当系统收到该程序的应用程序时,它将遍历记录空闲内存地址的链表,找到第一个空间大于请求空间的堆节点,然后从空闲节点列表中删除该节点。 ,并将节点的空间分配给程序。分配速度慢,地址不连续,并且很容易碎片化。另外,应用程序是由程序员编写的,程序员也必须负责破坏程序,否则会导致内存泄漏。

3. 2堆特征

操作系统具有一个链接列表,该列表记录了可用内存地址。当系统收到程序的应用程序时,它将遍历链接列表以查找其空间大于请求的空间的第一个堆节点,然后从可用空间中选择该节点。从链接列表中删除,然后将节点的空间分配给程序。另外,对于大多数系统而言,此分配的大小将记录在此内存空间的第一个地址,这样代码中的delete语句就可以正确释放此内存空间。另外,由于找到的堆节点的大小可能与应用程序的大小不完全相同,因此系统会自动将多余的部分放入空闲列表中。

([1)应用程序大小限制

堆是一个扩展到更高地址的数据结构,并且是一个不连续的存储区域。这是因为系统使用链表存储自然不连续的空闲内存地址,并且链表的遍历方向是从低地址到高地址。堆的大小受计算机系统中可用物理内存的限制。可以看出,堆获得的空间更加灵活,更大。

([2)堆使用效率

堆是new分配的内存,通常速度较慢并且容易出现内存碎片,但是使用起来最方便。

([3)堆使用的过程

堆:通常,一个字节用于在堆的开头存储堆的大小。堆中的特定内容由程序员安排。

摘要:

堆栈内存:从高地址到低地址,连续,快速,小空间;

堆栈内存:从低地址到高地址,不连续,缓慢且空间大。

可以列为下表:

如何申请

内存大小

使用效率

存储内容

堆栈(堆栈)

自动发布应用程序

高效

堆(堆)

手动申请发布

四、为什么C和C ++在传递数组时传递地址或引用?

从上面的分析中我们可以知道,由于该函数的参数存储在堆栈存储器中,所以如果一个数组比较大,我就传递一个大数组。如果将数组的值复制到形式参数,将不可避免地导致堆栈内存不足,即“堆栈溢出”,因此可以通过仅传递地址值而不传递实际值来避免此问题。 。实际上,诸如Java和C#之类的语言也具有相同的基本原理,这将在后面解释。

摘要:

C语言中函数的参数传递通常分为值传递/指针传递

在C#,Java和C ++中,函数的参数传递通常分为值传递/引用传递

实际上,从内存“堆栈存储器”的角度来看,所有函数参数的传递只有一种形式,即值传递。

因为参数是一个值,所以堆栈中的值将被复制到函数的形式参数中,这当然是值传递,

如果参数是地址或引用,它还将在堆栈区域中复制该地址或将引用传递给函数参数,但是此地址或引用不是真实数据,复制的地址相同或引用的任何人将指向同一条数据,因此我们称其为传递的引用或地址。

简而言之:传递地址或引用只是表面的,本质是“按值传递”。

个人理解,如果伟大的上帝有更好的理解,我希望与大家分享和交流,谢谢。如果您想彻底理解这些概念,可以将几篇文章结合起来阅读,以更好地理解它们。

五、 C#内存管理

有关详细信息,请参阅我的另一篇文章:

在一篇文章中了解C#的堆,栈,值类型,引用类型

C#(CLR)中的内存分配分析

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/shoujiruanjian/article-373658-1.html

计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别相关推荐

  1. php栈内存和堆内存的区别,内存中堆和栈的区别

    堆和栈的区别: ·      1> 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存. ·      2> 栈空间的内存由系统自动分配,一般存放局部变量等,不需要手动管理内存. ...

  2. java栈堆溢出怎么解决_java内存溢出示例(堆溢出、栈溢出)

    堆溢出:/** * @author LXA * 堆溢出 */ public class Heap { public static void main(String[] args) { ArrayLis ...

  3. Java 类中各成分加载顺序和内存中的存放位置

    一.什么时候会加载类? 使用到类中的内容时加载:有三种情况 1.创建对象:new StaticCode(); 2.使用类中的静态成员:StaticCode.num=9; StaticCode.show ...

  4. 深度解剖数据在内存中的存储!!数据在内存中原来是这样表示的?为什么浮点数和整数的存储方式差距这么大?

    文章目录 Data Storage 1. 数据类型 1.1 整型家族 1.2 浮点数家族 1.3 指针类型 1.4 构造类型 2. 整型在内存中的存储 2.1 二进制表示形式 2.1.1 正数 2.1 ...

  5. 深度剖析数据在内存中的存储2——浮点数数在内存中的存储

    根据国际标准IEEE:任意一个二进制浮点数V可以表示为下面形式: (-1)^SM2^E: (-1)^S表示符号位,当S为0,V为正数:当S为1,V为负数.由其物理结构决定了,浮点数为有符号数. M为有 ...

  6. oracle放在内存里,oracle如中何把小表钉住在内存中

    buffer_pool_defualt buffer_pool_keep buffer_pool_recycle 如果要把表钉死在内存中,也就是把表钉在keep区. 相关的命令为: alter tab ...

  7. nlp中bpe_缓冲池扩展(BPE)–内存中OLTP:内存挑战

    nlp中bpe In continuation of the previous post "Buffer Pool Extension (BPE) – Introduction to the ...

  8. java 将数据加载到内存中_java 将数据加载到内存中的操作

    将数据加载到内存中 1.建立InitListener.java package app.util; import java.util.HashMap; import java.util.Map; im ...

  9. java if在内存中_java如何将对象暂存到内存中?

    展开全部 form表单提交文件,建议用62616964757a686964616fe59b9ee7ad9431333264623862smartupload上传,暂存在web服务器目录下,然后稍微一下 ...

最新文章

  1. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
  2. tap/tun设备 veth设备
  3. c语言已知斜率 求倾角,倾斜解的问题
  4. 川大 计算机 博士 毕业要求,川大酝酿新规:博士生毕业不能直接当讲师
  5. matplotlib 显示批量图片_matplotlib入门
  6. DiagnosticsTextBox:WinForms的日志窗口
  7. Python爬虫基础:常用HTML标签和Javascript入门
  8. 反向代理和负载均衡有何区别?
  9. 卸载win10预装软件和小娜
  10. 计算机绘图培训心得,学习cad制图心得体会
  11. nvm在windows下的简单应用,CMD乱码,CMD的编码格式修改
  12. wincap的学习总结01
  13. 将MATLAB任务栏变成白色的图标恢复
  14. 自动化接口实战(一)
  15. 1044 火星数字(C语言)
  16. 《转贴》机器学习 机器视觉 图像处理 牛人牛站
  17. 利用WireShark抓包进行数据分析
  18. 小学计算机室每日管理日志,2017小学信息技术工作研修日志
  19. Python 成绩统计
  20. flt文件matlab,FLT文件格式.pdf

热门文章

  1. Springboot+vue 社团管理系统(前后端分离)
  2. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析
  3. 小程序嵌套h5页面_微信小程序内嵌h5页面
  4. 性能测试——负载测试、容量测试、极限测试、压力测试
  5. navicat的基本使用技巧
  6. Python基于机器学习的文本情感分析详细步骤[附代码和文字解释]
  7. For循环语句及使用
  8. Python输入一个字符串,输出其中每个字符的出现次数。要求使用标准库collotections中的Counter类...
  9. Java 杨辉三角
  10. 硬件基础知识(9)---电容容量、尺寸及作用