使用 VC8,我创建了两个类似于以下的模块:
标题
class IFoo
{
virtual void Bar() = 0;
};
模块 A
extern IFoo& Foo;
void DoStuff()
{
Foo.Bar();
}
模块 B
IFoo& Foo = ConcreteFoo();
VC8 通过本质上将 'Foo' 视为指向 IFoo 的指针来处理这个问题。无论在哪里看到 Foo.Bar()(即使在模块 B 中),它都会取消引用指针以获取对象的 vtable,查找 Bar() 的地址并调用它。这有点烦人,因为 Foo 实际上确实指的是一个具体的对象,而且总是如此。如果您可以执行以下操作,那就太好了:
模块 A
extern __concrete IFoo& Foo;
这会告诉编译器你承诺提供一个具体的对象来支持这个引用。然后它可以生成对 Foo.Bar() 的特殊外部引用并直接调用该方法而无需双重取消引用。
据我所知,Visual C++ 无法做到这一点,这会导致两个问题:
- 有没有办法让 VC 编译器生成直接方法调用?
- 有没有其他 C++ 编译器可以做到这一点?