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

时间:2012-03-08 13:03:42

标签: c++ oop

扩展课程时,多态性和构图之间的性能有什么不同吗?使用组合(在C ++中)使用以下示例:

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

        void update()
        {
            ....
            m_renderer.draw(this);
        }
    private:
        Renderer &m_renderer;
}

...并使用多态:

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

        void update()
        {
            ...
            draw();
        }
    protected:
        virtual void draw() = 0;
}

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

注意:我已查看类似帖子,例如this,但不包括效果。

感谢您的回答!

2 个答案:

答案 0 :(得分:5)

好吧,如果你提出这样的问题,那么就会有内存/速度权衡。

1。组合物

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

2。继承

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

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


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

首先编写理智代码。然后优化为(如果!!!)需要。

答案 1 :(得分:4)

我想你想要第二个版本:

class Window : public Renderer

在这种情况下,继承的内存实际上会更大。这是因为,当你继承某些东西时,这个类的大小至少会增加sizeof基类。

第一个版本实际上只会略微增加大小,因为您存储引用而不是实际对象。以下内容:

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

        void update()
        {
            ....
            m_renderer.draw(this);
        }
    private:
        Renderer m_renderer; //no reference
}

将占用更多空间。

更重要比决定这两者之间的任何事情都不是在性能方面(差异很小,如果有的话),而是两者之间的关系。组合和继承描述了不同的东西。

如果Window Renderer,请使用继承。如果Windows Renderer,请使用合成。