在扩展一个类时,多态和组合在性能上有什么区别吗?以下面的示例使用组合(在 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 ,但不包括性能。
感谢您的回答!
最佳答案
好吧,如果您这样提出问题,那么是存在内存/速度权衡。
1。组成
- 8 个字节(在 64 位架构上)可能被用于引用
2。继承
- 8 字节(在 64 位架构上)如果你需要让你的类多态(v 指针)
- 基类属性的一些开销(如果有的话)(注意:从有状态类继承是一种代码味道)
- ~20% 的虚拟通话开销(粗略估计,其中有很多变化)
所以您可能会说继承的成本稍微高一些……但实际上它只是不可见的。与图形渲染所需的内部计算相比,函数调用的开销可以忽略不计。
另一方面,语义不同。继承与否很重要。你是 Window
一个 Renderer
吗?有道理吗?
首先编写理智代码。然后根据需要进行优化(如果 !!!)。
关于c++ - 扩展类时的性能,组合与多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618092/