我正在研究一个应该从命令行使用的项目,其语法如下:
program-name input-file
该程序应该处理输入,计算一些东西并在stdout上吐出结果.
我选择的语言是C++,原因有几个,我不愿意辩论.计算阶段将是高度符号化的(思考编译器),并将使用非常复杂的动态分配数据结构.特别是,它不适合RAII风格的编程.
我想知道忘记释放内存是否可以接受,因为我希望整个计算消耗的内存少于可用内存,并且程序完成后OS可以在一步中自由回收所有内存(假设程序终止)很快).你有什么感受?
作为备份计划,如果我的项目需要作为服务器或交互式运行,我想我总是可以将垃圾收集器重新编译为源代码.有没有人有使用C++垃圾收集器的经验?他们运作得好吗?
在描述问题的具体情况下不应该引起任何问题.
但是,这并不完全正常.静态分析工具会抱怨它.最重要的是,它会制造坏习惯.
有时不释放内存是正确的做法.
我曾经写过编译器.在构建解析树并遍历它以编写中间代码之后,我们只需退出.解除分配树会有
为编译器添加了一点慢,我们当然希望尽可能快.
占用代码空间
花时间编码和测试解除分配器
违反了"没有代码执行比'没有代码'更好"的格言.
HTH!FWIW,这是"当天回归",当内存是非虚拟和最小的时候,盒子慢得多,前两个是非平凡的考虑因素.
我的感觉就像"WTF !!!"
这样看:
您选择不包含垃圾收集器的编程语言,我们不允许问为什么.
你基本上是在说你懒得放心地释放记忆.
那么,WTF又来了.懒惰不是任何事情的好理由,至少在没有释放它的情况下玩弄记忆.
只是释放内存,这是一个不好的做法,场景可能会改变,然后可能是一百万个原因,你可以需要释放内存,不做的唯一原因是懒惰,不养成坏习惯,习惯做事情是对的,这样你将来会倾向于做到这一点!
不释放内存应该不是问题,但这是一个不好的做法.
Joel Coehoorn是对的:
它不应该导致任何问题.
但是,这并不完全正常.静态分析工具会抱怨它.最重要的是,它会制造坏习惯.
我也想为你写的代码可能是添加有关释放这种想法很多比试图事后加装更容易.所以我可能会让它释放内存; 您不知道将来如何使用您的程序.
如果您想要一种非常简单的释放内存的方法,请查看Apache使用的"池"概念.
好吧,我认为这是不可接受的.你自己已经提到了潜在的未来问题.不要认为他们一定很容易解决.
像"......鉴于我希望整个计算消耗更少......"这些都是着名的最后一句话.同样,使用某些功能重新编写代码是他们都在谈论和永远不会做的事情之一.
在短期内不释放内存可能听起来不错,但从长远来看可能会产生大量问题.就个人而言,我认为这不值得.
有两种策略.要么从一开始就构建GC设计.这是更多的工作,但它会得到回报.对于许多小对象,使用池分配器并跟踪内存池可能会付出代价.这样,您可以跟踪内存消耗,并简单地避免许多类似代码但没有分配池的问题.
或者您从一开始就在整个程序中使用智能指针.我实际上更喜欢这种方法,即使它使代码混乱.一种解决方案是严重依赖模板,在引用类型时会占用大量冗余.
看看像WebKit这样的项目.他们的计算阶段类似于你的,因为他们为HTML构建解析树.他们在整个程序中使用智能指针.
最后:"这是一个风格问题......邋work的工作往往会形成习惯." - 大卫爱丁斯的巫术城堡中的丝绸.