工具的建设和存在时间
从技能角度说,OOP(面向工具措施设计)只是涉及抽象的数据范例、担任以及多形性,但另一些问题也大概显得很是重要。本节迁就这些问题举办探讨。
最重要的问题之一是工具的建设及粉碎方法。工具需要的数据位于哪儿,如何节制工具的“存在时间”呢?针对这个问题,办理的方案是各异其趣的。C++认为措施的执行效率是最重要的一个问题,所以它答允措施员作出选择。为得到最快的运行速度,存储以及存在时间可在编写措施时抉择,只需将工具安排在仓库(有时也叫作自动或定域变量)可能静态存储区域即可。这样便为存储空间的分派和释放提供了一个优先级。某些环境下,这种优先级的节制长短常有代价的。然而,我们同时也牺牲了机动性,因为在编写措施时,必需知道工具的精确的数量、存在时间、以及范例。假如要办理的是一个较通例的问题,如计较机帮助设计、仓储打点可能空中交通节制,这一要领就显得太范围了。
第二个要领是在一个内存池中动态建设工具,该内存池亦叫“堆”可能“内存堆”。若回收这种方法,除非进入运行期,不然基础不知道到底需要几多个工具,也不知道它们的存在时间有多长,以及精确的范例是什么。这些参数都在措施正式运行时才抉择的。若需一个新工具,只需在需要它的时候在内存堆里简朴地建设它即可。由于存储空间的打点是运行期间动态举办的,所以在内存堆里分派存储空间的时间比在仓库里建设的时间长得多(在仓库里建设存储空间一般只需要一个简朴的指令,将仓库指针向下或向下移动即可)。由于动态建设要领使工具原来就倾向于巨大,所以查找存储空间以及释放它所需的特别开销不会为工具的建设造成明明的影响。除此以外,更大的机动性对付通例编程问题的办理是至关重要的。
C++答允我们抉择是在写措施时建设工具,照旧在运行期间建设,这种节制要领越发机动。各人或者认为既然它如此机动,那么无论如何都应在内存堆里建设工具,而不是在仓库中建设。但还要思量别的一个问题,亦即工具的“存在时间”可能“保留时间”(Lifetime)。若在仓库可能静态存储空间里建设一个工具,编译器会判定工具的一连时间有多长,到时会自动“粉碎”可能“排除”它。措施员可用两种要领来粉碎一个工具:用措施化的方法抉择何时粉碎工具,可能操作由运行情况提供的一种“垃圾收集器”特性,自动寻找那些不再利用的工具,并将其排除。虽然,垃圾收集器显得利便得多,但要求所有应用措施都必需容忍垃圾收集器的存在,并能默许随垃圾收集带来的特别开销。但这并不切合C++语言的设计宗旨,所以未能包罗到C++里。但Java确实提供了一个垃圾收集器(Smalltalk也有这样的设计;尽量Delphi默认为没有垃圾收集器,但可选择安装;而C++亦可利用一些由其他公司开拓的垃圾收集产物)。
本节剩下的部门将接头哄骗工具时要思量的另一些因素。