【发布时间】:2020-05-04 02:45:39
【问题描述】:
我有一个Base 课程和一个Derived 课程。 Base 类的唯一目标是确保 Derived 实现成员函数。
struct Base
{
virtual void f() = 0;
};
struct Derived : Base
{
void f() override final {}
};
我没有多态地使用这个类,也就是说,我只是在堆栈上实例化 Derived 类型的对象,如下所示:
Derived obj;
我需要这样做数百万次。
编辑:只有少数实例同时存在(没有堆栈溢出)。
这里是否创建了vtable(我猜是在编译期间)?是否创建了vtable 对我来说是否重要,因为我不使用它(或者我不使用它)?我应该考虑使用这种设计有什么开销吗?如果Derived 没有实现f(),也许还有另一种方法可以确保编译器抱怨?
【问题讨论】:
-
这能回答你的问题吗? Is final used for optimization in C++?
-
为什么不在
Base中直接省略f()?如果Derived没有实现f(),obj.f()将无法编译。 -
您可以查看
Derived的大小。在我的例子中,it was 8 bytes,这意味着一个 vtable 指针。 如果Derived没有实现f(),也许还有另一种方法可以确保编译器报错? 当然,如果您为Derived的任何对象调用f,而没有f提供,编译将失败。另请参阅:Is it possible to write a template to check for a function's existence?。您可以编写一个元函数来检查存在f并使用它,例如,使用静态断言以获得更好的诊断。 -
如果你不使用多态类,你可以使用 CRTP 模式,它 a) 没有额外的神秘通道和口哨将确保需要实现的方法 b) 不使用 vtable 并可能导致优化来电
-
@Evg 好点,但想象一下这段代码在一个库中并且只能从另一个库调用。
标签: c++ compiler-optimization virtual-functions vtable dynamic-dispatch