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

标签 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 ,但不包括性能。

感谢您的回答!

最佳答案

好吧,如果您这样提出问题,那么存在内存/速度权衡。

1。组成

  • 8 个字节(在 64 位架构上)可能被用于引用

2。继承

  • 8 字节(在 64 位架构上)如果你需要让你的类多态(v 指针)
  • 基类属性的一些开销(如果有的话)(注意:从有状态类继承是一种代码味道)
  • ~20% 的虚拟通话开销(粗略估计,其中有很多变化)

所以您可能会说继承的成本稍微高一些……但实际上它只是不可见的。与图形渲染所需的内部计算相比,函数调用的开销可以忽略不计。


另一方面,语义不同。继承与否很重要。你是 Window 一个 Renderer 吗?有道理吗?

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

关于c++ - 扩展类时的性能,组合与多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618092/

相关文章:

c++ - 有没有办法在运行时获取 C++ 中的基类名称?

c++ - "anti-SFINAE"如果给定表达式*不*格式正确,则启用重载

ios - 消除 Objective C 中委托(delegate)的重复代码

iphone - ASIHTTPRequest代码设计

r - 如何使用方法在 S4 对象 r 中设置值(无需输入值)

PHP 静态关键字与 new 一起使用来构建对象

c++ - 移动构造函数在类中的位置/顺序很重要吗?模板转换运算符结合移动构造函数

c++ - 在 Visual Studio 中调试 x64 单元测试

C++ Qt - 获取物理磁盘大小 (Win32)

c++ - C++ 中的跨平台 OOP