扩展类,组合与多态时的性能

Jen*_*lom 1 c++ oop

扩展一个类时,多态性和组合之间的性能是否存在差异?使用组合(在C++中)使用以下示例:

class Window
{
    public:
        Window(Renderer &renderer) : m_renderer(renderer)
        { }

        void update()
        {
            ....
            m_renderer.draw(this);
        }
    private:
        Renderer &m_renderer;
}
Run Code Online (Sandbox Code Playgroud)

...并使用多态性:

class Window : public Renderer
{
    public:
        virtual ~Window() {};

        void update()
        {
            ...
            draw();
        }
    protected:
        virtual void draw() = 0;
}
Run Code Online (Sandbox Code Playgroud)

组合版本使用引用作为成员,所以我认为它需要更多的空间,但是在这两个版本中是否有任何性能提升?

注:我已签出后,如类似这样,但不包括性能.

谢谢您的回答!

Mat*_* M. 5

好吧,如果你提出这样的问题,那么是的,有一个记忆/速度权衡.

1.组成

  • 8个字节(64位架构)可能用于参考

2.继承

  • 8字节(在64位架构上)如果你需要让你的类多态(v指针)
  • 基类属性的一些开销(注意:继承有状态类是代码气味)
  • 虚拟呼叫的开销约为20%(总估计,那里有很多变化)

所以你可能会说继承成本略高......但实际上它只是看不见的.与图形渲染所需的内部计算相比,函数调用的开销几乎可以忽略不计.


另一方面,语义不同.无论你是否继承都很重要.你Window是一个Renderer?是否有意义 ?

首先写出理智的代码.然后优化为(如果!!!)需要.