关于虚函数的效率问题的一点点探讨

来源:互联网 发布:java整形转换成字符串 编辑:程序博客网 时间:2024/06/06 02:34
起因,看tamarian的代码,其中有一段注释:
    /**     * ScriptBufferImpl is the base class for script buffer     * implementations.     *     * This is a pure base class which must be subclassed to be used.     * Its methods are not virtual for performance reasons.     * For default script buffer behavior, use BasicScriptBufferImpl.      */

其中说到这里的ScriptBufferImple是一个只用来被继承的纯虚函数,但是为了效率问题,它的实现没有使用virtual。

我就产生了疑问,virtual确实会有一定的开销,因为如果是virtual函数,那么所有的调用就需要从基类的vtable中去寻找,从而带来一些性能损失。

接着,google了一下, 发现c++/C#及java的阵营做法不一样,参见http://stackoverflow.com/questions/814934/why-c-sharp-implements-methods-as-non-virtual-by-default

里面讨论两者的出发点。 发现JAVA由于有VM的存在,可以动态的做一些优化,从而对于virtual的效率没有那么care。

上面的讨论中,提到了大师(delphi)的一个很好的访谈(http://www.artima.com/intv/nonvirtual.html),大家可以去看看!主要就是阐述C#因为效率和API的实际使用场景上来说,把函数的定义默认为non-virtual, 而Java默认为virtual。
原创粉丝点击