我的http://www.csdn.net/expert/topic/1027/1027247.xml?temp=.8255426帖子中已经有了一些关于内存优化的讨论,欢迎继续讨论
Hawk_sun(骑士)
如果能用堆里的内存,一定不用栈里的内存,用完了就释放!
也既是:能够 char *s=new char[100]//堆中分配
决不char s[100];//栈里分配。
看来大家有必要讨论一下从Heap中分配和从Stack中分配的区别了,其实最大的区别在于释放该内存的顺序性上,所以说,一个释放动作可能会引起的操作的指令条数就不一样,顺便说一句,如果你写过vxd或者Wdm时你就知道,大量使用的还是HeapAlloc。
堆(内存)堆表示程序可用的内存区,也叫动态内存区。堆内存的分配与释放次序是随机的,这就是说,如果你按次序分配三块内存,那么到时并不按分配时的次序释放内存。 堆管理器会负责所有操作,堆是应用程序可用的三种内存区之一, 其它两种分别是全局内存区(存放全程变量) 和栈。与堆相反,全程变量内存在程序启动时就分配,然后一直保留到程序终止才释放;
BCB 使用堆为对象、字符串、动态数组及特殊的动态内存请求内存分配。
Windows 应用程序的地址空间最大允许有 2 GigaByte, 其中大部分能被堆使用。
栈(内存)
栈表示程序可用的内存区,栈内存动态分配,并按特定次序分配、释放。栈内存按后进先出次序(LIFO)分配,这表示最后分配的内存区先被释放。栈内存一般在例程中使用(过程、函数及方法调用)。 当你调用例程时,例程参数及返回值是放在栈中的(除非使用BCB缺省调用方式,对调用过程进行优化)。此外,函数中声明的变量也存放在栈中,所以当函数终止时,这些变量会被自动清除(在返回调用点之前以LIFO次序释放)。
栈是应用程序可用的三种内存区之一,其它两种分别是全局内存区和堆。
BCB使用栈存放例程参数及其返回值(除非你使用BCB缺省的 register 调用协定)、局部例程变量、Windows API 函数调用等等。
Windows 应用程序可以预留大量的栈内存,在 Delphi 中你可以通过工程选项的 linker 页设置, 不过一般采用缺省设置就可以了。 如果你收到一个栈溢出错误信息,这可能是因为你的函数进入了死循环自调用,而不是栈空间太小。
相反,堆好像没听说过溢出吧!
ALNG(?)
恰恰相反,我认为是能用栈就不用堆。尤其是:
char buff[100];
没有换成char *buff = new char[100]的理由。
char buff[100]只是把sp减去了100/sizeof(int). 如果不是递归函数[递归层数过深,每调用栈消费过大容易栈溢出], 如果你对要使用的空间的上限有准确的估计,如果这个值不是特别大,用栈, 效率应该比使用new 或malloc要高。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。