首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化C++中接口的外部引用?

如何优化C++中接口的外部引用?
EN

Stack Overflow用户
提问于 2010-02-04 21:41:12
回答 1查看 197关注 0票数 0

使用VC8,我创建了两个类似于以下模块的模块:

报头

代码语言:javascript
复制
class IFoo
{
    virtual void Bar() = 0;
};

模块A

代码语言:javascript
复制
extern IFoo& Foo;

void DoStuff()
{
    Foo.Bar();
}

模块B

代码语言:javascript
复制
IFoo& Foo = ConcreteFoo();

VC8通过将'Foo‘作为指向IFoo的指针来处理这个问题。无论在哪里看到Foo.Bar() (即使在模块B中),它都会删除指针以获取对象的vtable,查找Bar()的地址并调用它。这有点让人恼火,因为Foo实际上是指一个具体的对象,而且总是这样。如果你能做以下这样的事情,那就太好了:

模块A

代码语言:javascript
复制
extern __concrete IFoo& Foo;

这将告诉编译器,您承诺提供一个具体的对象来支持此引用。然后,它可以生成对Foo.Bar()的特殊外部引用,并直接调用该方法,而不需要双重取消引用。

据我所知,VisualC++无法做到这一点,这就引出了两个问题:

  1. 有没有办法让VC编译器生成直接的方法调用?
  2. 还有其他的C++编译器可以吗?
EN

回答 1

Stack Overflow用户

发布于 2010-02-04 21:46:24

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

模块A

外向型Biz Foo;

模块B

Biz = ConcreteFoo();

(假设constructor.)有Biz的副本)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2203451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档