【问题标题】:Having large abstract class in c++ is good or not?在 C++ 中拥有大型抽象类好还是不好?
【发布时间】:2012-09-15 04:51:43
【问题描述】:

我想知道用c++创建一个包含多个纯虚方法的抽象类好不好?

例如在某些情况下,例如实现会话启动协议的对话,我们发现它可以使用桥接模式来实现。但是为通用操作拥有抽象基类会导致拥有一个非常大的抽象类。现在从性能的角度来看,使用和实现这样的类有什么效果?

假设我们有不同的对话框,每个对话框都有自己的实现。 (例如:InviteDialog、RegisterDialog、InfoDialog、...)

应用桥接模式:

class IIDialog{
public:
/*there are multiple pure virtual methodes at least 15*/
virtual int32_t SendResponse(ISipMessage* response) = 0;
protected:
/*there are multiple methods that use pure virtual methods*/
int32_t Send_Response(){retun SendResponse(response);}
}

class IInviteDialog : public IIDialog
{
/*Implemet virtual methods*/
}

class IRegisterationDialog : public IIDialog
{
/*implement virtual methode*/
}

忽略的其他部分实现(上述类使用的实际实现和实现抽象)

谢谢

【问题讨论】:

  • 从设计的角度来看,拥有一个大类往往不是坏事,不管它是否抽象。
  • 如果您强调该开销,您可能会发现 24/7 服务器可能在一个月内为您节省大约 2-3 秒的 CPU 时间。我可以自信地说,如果你有一个大的 vtable 布局,你有更重要的事情要强调,以节省这几秒钟,比如为什么你一开始就有这么大的 vtable。
  • 在设计之初,我选择使用继承来实现这些类。但我发现使用继承使类的客户端具有类型转换。为了防止类的客户端在使用派生类时进行类型转换,我决定应用桥接模式。在桥接模式中,我们需要识别共性和变异性。通过这样做,我发现了非常多的共性操作。我必须在基于 Gof 书的抽象类中具有通用操作。我想知道你的建议是什么?

标签: c++ performance visual-c++ design-patterns bridge


【解决方案1】:

对于大多数现代 C++ 编译器,您可以假设构造对象时的性能开销不取决于虚拟方法的数量。

当实际调用这些方法时,我预计开销不会大于任何替代实现方法的开销。

如果这些函数调用执行诸如网络操作之类的“复杂”事情,那么无论如何您都不需要担心这种微优化,这将完全无关紧要。

【讨论】:

    【解决方案2】:

    从性能的角度来看,虚拟方法的数量在 C++ 中并不重要(无论方法的数量如何,都需要为间接支付一个小的固定价格)。

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2011-10-07
      • 2013-11-29
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多