分配的实现对象,因此你引入了动态分配内存(还有接下来的内存销毁)所固有的开销,还有可能遇到的bad_alloc(内存溢出)异常。
对接口类来说,每次函数调用都是virtual的,所以在你每次调用一个函数的时候,都会有一次间接跳转的开销(Item 7)。同时,从接口类中派生出来的对象必须包含一个虚表指针(Item7)。这个指针可能会增加对象存储需要的内存容量,取决于接口类是否为此对象提供虚函数的唯一来源。
最后,脱离inline函数句柄类和接口类都不会有很大作为。Item30解释了为什么函数体必须要放在头文件中从而被inline,但是句柄和接口类正是用来设计隐藏像函数体一样的实现细节的。
如果你仅仅因为额外的开销就放弃使用句柄类和接口类就大错特错了。虚函数也是如此,你并不想放弃它们,对吧?(如果想放弃,你看的书就是错误的)相反,使用一种循序渐进的方式来使用它们。在开发过程中使用接口类和句柄类最小化修改实现造成的对用户的影响。如果使用句柄类和接口类对速度和容量造成的影响要大于类之间的耦合,那么用具现类进行替换。
8. 总结:
最小化编译依赖背后的知道思想是依赖于声明而不是依赖于定义。基于这个思想的方法是句柄类和接口类。
库头文件应该以完全且仅有声明的方式存在。不管是否涉及到模板都适用。