在C++中编译时间与运行时多态性的优点/缺点

mcl*_*sen 5 c++ architecture polymorphism

在C++中,当使用运行时(子类,虚函数)或编译时(模板,函数重载)多态时可以实现相同的功能时,为什么要选择一个而不是另一个?

我认为编译时代的多态性编译代码会更大(为模板类型创建更多的方法/类定义),编译时间会给你更大的灵活性,而运行时会给你"更安全"的多态性(即更难意外使用不正确).

我的假设是否正确?是否还有其他优点/缺点?任何人都可以给出一个具体的例子,其中两个都是可行的选择,但一个或另一个将是一个明显更好的选择?

此外,编译时多态是否会产生更快的代码,因为没有必要通过vtable调用函数,或者这是否会被编译器优化掉?

例:

class Base
{
  virtual void print() = 0;
}

class Derived1 : Base
{
  virtual void print()
  {
     //do something different
  }
}

class Derived2 : Base
{
  virtual void print()
  {
    //do something different
  }
}

//Run time
void print(Base o)
{
  o.print();
}

//Compile time
template<typename T>
print(T o)
{
  o.print();
}
Run Code Online (Sandbox Code Playgroud)

小智 6

静态多态性产生更快的代码,主要是因为积极内联的可能性.虚函数很少被内联,并且主要在"非多态"场景中.请参阅C++ FAQ中的此项.如果速度是你的目标,你基本上别无选择.

另一方面,使用静态多态时,不仅编译时间,而且代码的可读性和可调试性更差.例如:抽象方法是一种强制执行某些接口方法的简洁方法.要使用静态多态性实现相同的目标,您需要还原到概念检查或奇怪的重复模板模式.

当你真的必须使用动态多态时,唯一的情况是在编译时实现不可用; 例如,当它从动态库加载时.但在实践中,您可能希望交换性能以获得更清晰的代码和更快的编译.