0

使用 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++ 无法做到这一点,这会导致两个问题:

  1. 有没有办法让 VC 编译器生成直接方法调用?
  2. 有没有其他 C++ 编译器可以做到这一点?
4

1 回答 1

3
  1. 不要担心一个很小的 ​​vtable 查找,除非分析表明它是一个瓶颈。(提示:可能不会。)
  2. 编译器应该如何知道具体的返回类型ConcreteFoo()是什么?如果Foo::Bar()是虚拟的,则编译器无法创建对的静态调用,Foo.Bar()因为Foo' 的类型在编译时是未知的。
  3. 如果知道 的实际类型Foo,例如Biz,您可以取消引用:

    模块 A

    extern Biz Foo;
    

    模块 B

    Biz Foo = ConcreteFoo();
    

    (假设Biz有一个复制构造函数。)

于 2010-02-04T21:46:24.990 回答