查看单个帖子
  #57 (permalink)  
旧 2008-03-02
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,563
文章: 6
cat 正向着好的方向发展
默认 回复: 请教各位大大关于动态内存管理的问题……

引用:
作者: sjinny
如果在java中,我一直持有一个指向垃圾的引用,那么gc该不该回收它?gc能像程序员一样理解程序吗?或者比程序员更好的理解程序?如果不能很好的理解程序和程序开发的意图,那么这样的优化靠得住吗?
GC不用猜,他就是不回收。编译优化只作他确定与原来程序语义完全等价的步骤。比如ajoo说的,如果一个局部变量你new完没有传出去变量的生存期就结束了,那么编译器就直接把它做成一个stack变量就是一种优化。
至于为什么有些优化程序员会算不清楚,因为优化过的代码非常难懂,但寄存器布局最优计算用的指令最少。
引用:
作者: sjinny
可是如果我发现原先交给gc挂历的某些资源需要更及时的释放,我该怎么办呢?
call System.GC.Collect() 各种资源之间是不同的,你要让GC来管理那些本应该你自己管的东西就不对了。
引用:
作者: sjinny
所以对于智能指针,一方面它的释放时间有未知性,但是另一方面,程序员对它的释放时机还是能有所掌握的,毕竟当没有人使用它时它一定会被销毁。
心理问题……其实你上面那句话看出来,用不用gc其实都不知道它什么时候释放内存。所以其实区别不大。可能你这里函数退出的时候就有一个dtor然后连带了好多好多dtor释放智能指针, 结果卡一下。这和gc突然介入相比感觉上也好不到哪里去。
如果你这里关心的是对象的销毁,那么用智能指针也不是一个好的选择。原因如上,你还是不知道它什么时候销毁。可能你不小心引入了一个循环引用,或者不小心多copy了一份。那么就没人帮得了你了。你甚至很难知道这个多出来的引用在哪里。对于这种类型的东西,用using这种scope管理,或者来一个pool集中管理,到时候把pool销毁等,都比用智能指针“确定”得多。如果你觉得pool销毁了内存还没回收,你也可以在那里写一个GC.Collect(). 虽然我觉得大多数情况下并不必要。GC比你清楚内存还剩多少。
引用:
作者: sjinny
还是之前的话,技术应该帮助程序员更好的理解和把握自己的程序,而不是反过来让程序员越来越难以把握自己写的程序。if、for、while这些结构帮助程序员更好地组织代码运行流程,从而让程序员更容易理解程序;而有些技术则恰恰相反,有点杀鸡取卵的味道。
隐藏细节恰恰帮助程序员更好地把握程序。GC就把和内存相关一些细节隐藏在了你背后。如果这些细节恰巧对你来说不重要,那么GC就大大帮助你集中注意搞设计。就像高级语言把寄存器布局,CPU流水等等都藏了起来。CPU也没告诉你你的指令可能会被乱序执行(可能有些编译优化器知道,并且会有针对地作优化)。

此帖于 2008-03-02 08:42 PM 被 cat 编辑.
回复时引用此帖