我的问题很简单,如果你有一个纯虚拟类(接口)但是由于当前的活动构建,只编译了一个派生类,是否还会创建一个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的开销?
THX
答案 0 :(得分:1)
这是潜在的链接时优化(但显然无法在编译时进行)。
答案 1 :(得分:0)
你仍然可以获得vtable。毕竟,编译器不知道是否将在其他一些翻译单元中使用类Foo
。或者也许你会将它打包成一个库,其他一些用户将从Foo
派生出来;再一次,编译器不知道先验。
答案 2 :(得分:0)
你可能会得到vtable的开销,因为类总是被子类化(如果示例代码的内容在标题中):
class Foo_3 : public Foo_1 {
void bar() { Foo_1::bar(); ... }
}
如果所有代码都在同一个翻译单元中,编译器可能能够全部解决。