【发布时间】:2015-02-04 22:39:11
【问题描述】:
考虑一个程序,它有一个类 Foo,其中包含一个函数 Foo::fn,声明如下:
virtual void fn();
还有一个名为Bar 的Foo 的子类。将像这样声明Bar::fn:
virtual void fn() override final;
导致在Bar 或Bar 的子类中调用fn 更有效,还是它只会阻止Bar 的子类覆盖fn?如果使用final 使调用更高效,那么定义Bar::fn 使其功能与Foo::fn 完全相同的最简单、最有效的方法是什么?
【问题讨论】:
-
没有。编译器在确定如何编译调用
Foo::fn的代码时甚至不知道Bar的存在(假设最常见的情况是它位于另一个禁用了全程序优化的翻译单元中)。你为什么担心 vtable 的大小? -
我怀疑 vtable 的大小保持不变,但 final 标记了它,因此编译器不允许在派生类中覆盖
-
类的实例中通常没有 vtable。实例包含 vptrs。
-
一个更好的问题可能是询问何时可以忽略 vtable。例如。
void (Bar &b) { b.fn(); }。这可以忽略 vtable,因为它知道b.fn()必须调用B::fn。 -
不,它不会使 vtable 变小。即使您已将其声明为 final,它仍然需要在 vtable 中,因为您可以通过基类调用它。
标签: c++ performance c++11 vtable