【发布时间】:2012-03-26 19:41:54
【问题描述】:
我的问题很简单,如果你有一个纯虚拟类(接口),但由于当前的活动构建,只编译了 1 个派生类,还会创建一个 vtable 吗?
class Foo
{
virtual void bar() = 0;
}
#if 1
class Foo_1 : public Foo
{
void bar() {cout<<"foo_1";}
}
#else
class Foo_2 : public Foo
{
void bar() {cout<<"foo_2";}
}
#endif
他们(据我所知)在这种情况下不需要 vtable。
那么这会得到优化还是你仍然会得到 vtable 的开销?
谢谢
【问题讨论】:
-
你认为指向
virtual函数的指针在哪里......? -
假设编译器在这里优化了一些东西,现在我添加一个带有
class Nasty : public Foo { void bar() {} };的nasty.cpp文件。 -
@ R. Martinho Fernandes,你的说法是对的,但这是在编译时就知道的......所以如果它们是从 Foo 派生的多个类,是的,它们应该是一个 vtable。但是如果(就像我的情况)他们只是一个,你真的不需要它吗?还是你?
-
@moiself 无论如何,只有一种方法可以知道,那就是编译和查看。
-
每个类(而不是每个对象)只有一个 vtable,因此内存开销不应成为问题。虚函数调用仅在通过指向基类的指针调用时使用 vtable,因此如果您只有一个派生类 (
Foo_1) 并且只有Foo_1的对象,那么它们就没有开销。