内存分配问题

来源:互联网 发布:王自如和雷军 知乎 编辑:程序博客网 时间:2024/06/13 23:49

寄存器:最快保存区域。有编译器分配,我们不能直接控制。

堆栈(RAM中):(类似于栈):主要存储基本的数据类型和对象引用。编译是必须知道栈内所保存数据的“长度”以及“存活时间”。向下移动创建内存,向上移动释放内存,运行速度快,但不灵活,通过“堆栈指针”获得处理支持。

堆(RAM中):比起栈不必知道“长度”和“存活时间”,更加灵活。但是由于是请求操作系统分配的,所以“分配”和“销毁”需要很多时间。主要用于存储对象。

静态存储(RAM中):static声明的在“数据区”。

常数存储:位于代码内部("代码区"),这样很安全,永远不会改变。

非RAM存储:数据完全独立于一个程序之外。最主要的是“流式对象”和“固定对象”。流式对象(对象变成字节流通常发给另一台机器)。固定对象(保存在磁盘中)。

 

 

 

 

堆栈和堆有什么区别堆栈和堆有什么区别堆栈和堆有什么区别堆栈和堆有什么区别? 

  答:栈和堆栈都指的是Stack,它们与堆(heap)是不同的概念,要注意区分开来。   栈(stack)是限定仅在一端进行插入或删除的线性表。虽然这个限制减小了栈的灵活性,但是它也使得栈更有效且更容易实现。许多应用都只是需要提供受限制的插入和删除操作,在这种情况下使用较简单的栈结构比使用一般的线性表更有效。   从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:   在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时.   堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! 1、什么是堆栈?   答:堆栈是一个在计算机科学中经常使用的抽象数据类型. 堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先处(LIFO)队列.   堆栈中定义了一些操作. 两个最重要的是PUSH和POP. PUSH操作在堆栈的顶部加入一个元素. POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一.   现代计算机被设计成能够理解人们头脑中的高级语言. 在使用高级语言构造程序时最重要的技术是过程(procedure)和函数(function). 从这一点来看, 一个过程调用可以象跳转(jump)命令那样改变程序的控制流程, 但是与跳转不同的是, 当工作完成时,函数把控制权返回给调用之后的语句或指令. 这种高级抽象实现起来要靠堆栈的帮助.   堆栈也用于给函数中使用的局部变量动态分配空间, 同样给函数传递参数和函数返回值也要用到堆栈. 

原创粉丝点击