| ||||
| 摁,说起应用领域,不才是做手机平台的。CPU慢就不说了,内存也少得可怜。再有,现在手机要求用户长年不关机,不重启,尤其是在用户拨打110或者119等免费号码报告自己位置的时候,不能重启。 那么说说symbian里面如何管理内存的,说出来极端一点,几乎不在栈上初始化。所有的C类都推荐把构造函数设置为private的,而提供一个static的NewL来强制在堆上初始化。 然后在使用指针前一律推入一个CleanupStack,用好后在pop出来,一旦出了问题,CleanupStack遍历所有推入的对象,一一释放。具体可以参考俺前年的文章: 资源管理的“变法” - C++,算法,设计模式 后半部分给出的就是一个简化的说明。 |
| |||
| to pora: 没有不公平啦,那是后一个release测的,大家觉得还是硬件导致的比重大一点。另外我们的这种online service C++也不敢太关注效率,动不动就crash可不行,宁可慢一点的。反正bottleneck在DB和web service call. to sjinny: 引用:
ref counter一看就很慢很浪费,和你一开始说内存小CPU贵矛盾。而且中间漏写/写错这些wrapper就会提前释放或者泄露。这可不是不会发生的事情啊,以前就碰到过,查了好久的说。 这个和你说的一样是“高确定性”和“自动化”的,但是代价却不小。要高效和要自动有的时候是矛盾的。 此帖于 2008-02-19 02:47 AM 被 cat 编辑. |
| ||||
| 这么晚还在线啊…… 实践上发生的概率我也说不清。 ref count的慢和浪费我觉得如果少用那么是可以接受的,按照我心中的优先顺序是:桟 > 内存池 > 智能指针 >= gc。 所以大多数情况下应该把生存期分析清楚了,用前两个来做。我发的这些帖子,就是希望能够找到更多的机制,来填补智能指针之前的空白,毕竟桟和内存池的表达力还是有限的。 其实,自动化的目的是为了减少人脑资源的耗费,而高确定性则是让人比较容易了解系统运行的过程,从而提高可靠性改善的可能以及性能优化的可能。 至于那些wrapper,既然叫做wrapper,那么就是不需要重复写很多遍的东西。很多操作,如果只做一次,人们往往能够做好,要重复做很多遍就难免不出错了。所以把addRef和subRef封装起来后,智能指针的使用就容易了很多。 此帖于 2008-02-19 03:47 AM 被 sjinny 编辑. |
| ||||
| 引用:
|
| ||||
| 也许对于某些重复性的事务,机器可以做得比人好,但是我坚信,凡是需要分析、思考和创造的事情,人都能比机器做得更好。我不把编程看作一种重复性事务,至少对于开发游戏引擎的人来说,每一次开发都会与过去有所不同,都需要有所改进和创新。 所以我不喜欢java那样剥夺程序员选择的权力,我更喜欢C++这样尊重程序员的智慧的语言。C#里也是既有桟又有gc,C++09里也会加入可选的gc。 不过另一方面,虽然我喜欢有更多的选择,但是我也承认,选择一般都是个麻烦。我觉得好的设计应该是,为使用者提供更多的选择、更多的可能,但是如果使用者不想选择,那么提供足够好的缺省选项。但是对于程序员这样的用户,一般都会进行选择的吧。 |
| ||||
| Symbian操作系统中,没有异常。主要是考虑异常的实现(例如结构化异常)对于手机来说代价很高。另外,早期的Symbian不支持多线程,现在的Symbian虽然勉强支持了,但是仍然不鼓励使用,除非极为特别的情况。 整个这套机制中还有一个重要的前提,就是构造函数是危险的,因为一旦在构造过程中出现内存耗尽,或者资源耗尽。则没有任何人可以回收构造了一半的资源,于是手机只好重启。所以要求构造函数是非public的并且实现必须为空。真正的初始化要被CleanupStack保护好后再进行。 另外,非内存资源,如文件,网络等等,也是通过CleanupStack保护的。 |
| ||||
| 另外,的确内存管理的方法很多,基本上各有利弊。兼收并蓄,不排斥任何一种方法才是C++的风格(正如C++多范式的特点一样)。当然,这是一个双刃剑。相信使用dos脚本或者unix shell的时候,没有用户会care内存释放的问题,使用python,或者perl等轻量快速脚本的时候,很难想象自己一个一个谨慎delete,或考虑生存期,会多么分散对算法本身的注意力。 并且栈的确有时不够用,因为对象引用的语义是很多程序中不可或缺的。 最后,我还是要提出那个最笨、最不负责任的方法。如果是一次性计算,只申请,不释放,程序结束后统一交给OS回收。这个方法适合相当多的场合。当然你的OS不要太老就足够了。 |
| |||
| 选择多累啊,如果有人帮忙选好了说用这些就成那才爽呢。老分心想内存有没有漏,异常了漏不漏,活都干不完了……RAII是个好东西,智能指针毛病比较多(搞错语义的事情碰到过的,尤其是copy的时候,以及和Legacy code接的时候必须要脱掉马甲的时候)。 人花时间下去确实可以做出更优化的内存管理(OS的kernel一般很细致),但这个成本是不是值得就要看了。另外就是liu的那个铁律问题,如果到处都要人判断的话,你做的优化被某个人一不小心就搞坏了。 |