gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:49 24 4
gpt4 key购买 nike

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

我认为编译时多态性的编译代码会更大(为模板类型创建更多方法/类定义),并且编译时会给你更多的灵 active ,而运行时会给你“更安全”的多态性(即更难被意外错误使用)。

我的假设是否正确?还有其他优点/缺点吗?谁能举一个具体的例子,说明两者都是可行的选择,但其中一个显然是更好的选择?

此外,编译时多态性是否会产生更快的代码,因为不必通过 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();
}

最佳答案

静态多态性产生更快的代码,主要是因为积极内联的可能性。虚函数很少可以被内联,而且大多出现在“非多态”的场景中。在 C++ FAQ 中查看此项.如果速度是您的目标,您基本上别无选择。

另一方面,使用静态多态性时,不仅编译时间,而且代码的可读性和可调试性都更差。例如:抽象方法是一种强制执行某些接口(interface)方法的简洁方法。要使用静态多态性实现相同的目标,您需要恢复到概念检查或 curiously recurring template pattern .

真正必须使用动态多态性的唯一情况是编译时实现不可用;例如,当它从动态库中加载时。但实际上,您可能希望用性能来换取更清晰的代码和更快的编译速度。

关于c++ - C++ 中的编译时多态性与运行时多态性的优点/缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com