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

起因,看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。

你可能感兴趣的:(java,buffer,performance,Delphi,methods,behavior)