CSDN博客

img kk2001

C++方面

发表于2005/1/2 15:20:00  627人阅读

分类: 學習路程

1)  about  stack,  system  will  allocate  memory  to  the  instance  of  object  automatically,  and  to  the  heap,  you  must  allocate  memory  to  the  instance  of  object  with  new  or  malloc  manually.  
2)  when  function  ends,  system  will  automatically  free  the  memory  area  of  stack,  but  to  the  heap,  you  must  free  the  memory  area  manually  with  free  or  delete,  else  it  will  result  in  memory  leak.  
3)栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  
4)堆上分配的内存可以有我们自己决定,使用非常灵活。


堆和栈的比较  
 
     从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:  
 
     在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor  belt)一样,Stack  Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时.  
 
     堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致效率低的原因,  

内存中的东西分三类:代码(code)、数据(data)、栈(stack),  
其中stack是负责子程序的调用和返回的,stack实行后进先出的机制,调用子程序时先将当前地址的下一个地址临时保存到stack中,而子程序根据这个地址返回。  
在子程序(函数)内部分配的局部变量也是在stack中分配,这样,函数返回时,分配的空间也自动收回。  
而heap则是系统从data区中特别挪用并且独立管理的一个数据区,用于程序执行中数据的动态分配。  
从表相看:全局静态数据在data中,局部分配的静态数据在stack中,动态分配的数据在heap中。  
0 0

相关博文

我的热门文章

img
取 消
img