打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
软件性能的优化
我的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要高。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi引用C对象文件
堆和栈的区别
堆和栈_stm32 walkdream.com
栈和堆的区别
50道c++面试题
局部变量、全局变量、堆、堆栈、静态和全局
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服