扩展课程时,多态性和构图之间的性能有什么不同吗?使用组合(在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,但不包括效果。
感谢您的回答!
答案 0 :(得分:5)
好吧,如果你提出这样的问题,那么是就会有内存/速度权衡。
1。组合物
2。继承
所以你可能会说继承成本略高......但实际上它只是看不见的。与图形渲染所需的内部计算相比,函数调用的开销几乎可以忽略不计。
另一方面,语义不同。无论你是否继承都很重要。你是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
,请使用合成。