C++ 是不是有不使用 vtable 的接口的静态多态实现?

Posted

技术标签:

【中文标题】C++ 是不是有不使用 vtable 的接口的静态多态实现?【英文标题】:Does C++ have a static polymorphism implementation of interface that does not use vtable?C++ 是否有不使用 vtable 的接口的静态多态实现? 【发布时间】:2010-04-06 19:09:17 【问题描述】:

C++ 是否有正确实现不使用 vtable 的接口?

例如

class BaseInterface
public:
virtual void func() const = 0;


class BaseInterfaceImpl:public BaseInterface
public:
void func() std::cout<<"called."<<endl; 


BaseInterface* obj = new BaseInterfaceImpl();
obj->func();

最后一行对 func 的调用转到 vtable 以查找 BaseInterfaceImpl::func 的 func ptr,但是有没有任何 C++ 方法可以直接执行此操作,因为 BaseInterfaceImpl 不是从纯接口类之外的任何其他类中继承的基础接口?

谢谢。 吉尔。

【问题讨论】:

你为什么要关心它是否通过 vtable? 因为我正在做一个速度很重要的项目。另外,我认为 vtable 是完全 oo 多态性的一个很好的解决方案,但是对于实现“接口”来说有点过头了,我希望会有一些更轻的解决方案存在.. @gilbertc:我认为这里有一个误解。 任何接口概念的“正确”实现都将通过类似 vtable 的东西。否则,动态多态是不可能的。 我不得不说,如果您担心多态性开销,那么您要么使用错误的语言,要么以错误的方式使用语言。配置文件并查看您在哪里吃周期。如果它在 vtable 中,那将是非常令人惊讶的。 @Joel:这种开销很有可能是有问题的。这并不意味着 OP 做错了什么。 (当然,如果没有分析并实际确认这是一个问题,这属于过早优化的标题) 【参考方案1】:

是的。它的绰号为CRTP。看一看。

【讨论】:

特别是标题“静态多态性”:en.wikipedia.org/wiki/…也许您可以将该示例编辑为您的答案? 没问题。我很好奇,您的代码是否经过优化,即使 vtable 查找的小开销也会损害性能?什么应用?通常它被用作节省空间或用于 RAII 问题的实现。【参考方案2】:

我认为在任何语言中,除非它在编译时知道需要调用什么函数,否则它必须使用某种等效的 vtable 才能进行动态调度。这可能是聪明的编译器优化的结果,或者是诸如 CRTP 之类的技术(小麦已经提到过)。

【讨论】:

顺便说一句,我无法理解如何通过 vtable 进行这样的调用“不正确”。 @thomas, rmeador:同意我不应该使用正确的词。应该沿着“更高效”、“轻”的接口实现方向。

以上是关于C++ 是不是有不使用 vtable 的接口的静态多态实现?的主要内容,如果未能解决你的问题,请参考以下文章

C++虚函数除了vtable怎么实现? [复制]

c++ 继承问题:未定义对“vtable”的引用

如何从 C++ vtable 中获取指针?

Qt C++ Q_OBJECT 错误未定义对 vtable 的引用

如何在 Visual C++ 中检查 vtable?

从vtable到设计模式——我的C++面向对象学习心得