堆栈的理论知识

原创 2015年07月08日 14:16:25

堆和栈的理论知识
1.申请方式

栈:由系统自动分配和回收。
   例如,声明在函数中的一个局部变量int b,系统自动在栈中为b开辟空间。
堆:需要程序员自己申请,并指明大小,在C语言中用malloc等函数申请。
   例如:p1 = (char*)malloc(10*sizeof(char)) ;
    在C++中使用new运算符进行,但是注意p1,p2本身是在栈中的。

2.申请后系统的响应

   栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
   堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程
将该节点从空间节点链表中删除,并将该节点的空间分配给程序。对于大多数
系统,会在这块内存空间中的首地址处记录本次分配的大小,
这样,代码中的delete语句才能正确地释放本内存空间,另外,由于找到的
对接点的大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放
入空闲链表中。

3.申请大小的限制

    栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存的
在Windows下,栈的大小是2MB(也有的说是1MB,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间将提示overflow.因此,
能从栈获得的空间较小。
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统
使用链表存储空闲内存地址的,自然是不连续的。而链表的遍历方向是由低地址
向高地址,堆的大小受限于计算机系统的有效虚拟内存。由此可见,堆获得的空
间比较灵活,也比较大。

4.申请效率的比较

    栈:由系统自动分配,速度较快,但程序员无法控制,当然也可以自行申请栈空间。
    堆:是有new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

5.堆和栈中的存储内容

    栈:在函数调用中,入栈的是函数地址,函数的参数,局部变量等。参数是从右往左入栈的,注意静态变量是不入栈的
    堆:一般是堆的头部用一个字节存放堆的大小。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mongoDB的读书笔记(via3.0)(05)_【Sharding】(03)_关于Shard Keys与Hash的理论知识小絮叨

紧急出个差,但是又不能不继续写,少写点,先把Shard key和Hash的一些小概念继续写一写。Shard KeysmongoDB的Sharding最重要的就是Shard Key。用Shard Key...

用VC进行COM编程所必须掌握的理论知识

这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避免编程细节。完全是根据我自己的学习体会写的,其中若有技术上的错误之处,请大家多多指正。   一、为什么要用COM   软件工程发展到今天,从一开...
  • xust999
  • xust999
  • 2011年05月16日 16:34
  • 650

Android初级教程理论知识(第三章测试&数据存储&界面展现)

首先介绍单元测试,我在javaweb部分有详细介绍单元测试框架的一篇文章。 可以先看在javaweb中的单元测试详解篇http://blog.csdn.net/qq_32059827/article/...

HEVC/H.265理论知识(3)——帧内预测

一、帧内预测,利用当前图像内已经编码的像素生成预测值 二、生成预测值之后,和原始的值相减,得到残差,后续的变换量化等操作就是基于残差进行处理的 三、帧内预测的大致流程是这样的 (...

INLINE HOOK过驱动保护的理论知识和大概思路

INLINE HOOK过驱动保护的理论知识和大概思路,简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节。5个字节就是一...

用VC进行COM编程所必须掌握的理论知识

这篇文章是给初学者看的,尽量写得比较通俗易懂,并且尽量避免编程细节。完全是根据我自己的学习体会写的,其中若有技术上的错误之处,请大家多多指正。    一、为什么要用COM    软件...
  • irr80
  • irr80
  • 2011年01月30日 18:09
  • 356

Java-理论知识之线程组ThreadGroup

ThreadGroup线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。 线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。 允许线程访问有关自己的线程组的信息,但...

图像的腐蚀(erode)和膨胀(dilate) 开运算以及闭运算------理论知识及其对应函数

腐蚀和膨胀是数学形态学上的名词,如果用于图像处理上则就称为图像二值形态学。 形态学主要是为了获取物体的拓扑和结构信息,通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。当形态学运用到图...

Android初级教程理论知识(第一章快速入门)

一、综合介绍。 Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包...

struts2拦截器理论知识

struts2拦截器
  • HibonLi
  • HibonLi
  • 2016年11月15日 19:17
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆栈的理论知识
举报原因:
原因补充:

(最多只允许输入30个字)