【发布时间】:2012-10-09 10:42:09
【问题描述】:
我有一个具有两个虚拟成员函数的类:foo 和 wrapper。 foo 又短又快,wrapper 包含一个循环多次调用foo。我希望有一些方法可以内联对 foo 的调用在包装函数内,即使是从指向对象的指针调用时:
MyClass *obj = getObject();
obj->foo(); // As I understand it, this cannot be inlined. That's okay.
obj->wrapper(); // Nor will this. However, I hope that the machine code
// for the wrapper function will contain inlined calls to
// foo().
本质上,我希望编译器生成多个版本的包装函数——每个可能的类一个——并内联调用适当的foo,这应该是可能的,因为之前确定了对象类型选择要执行的wrapper 函数。 这可能吗?有没有编译器支持这种优化?
编辑:我感谢迄今为止的所有反馈和答案,我最终可能会选择其中之一。但是,大多数回复忽略了我问题的最后一部分,我解释了为什么我认为这种优化应该是可行的。这确实是我问题的症结所在,我仍然希望有人能解决这个问题。
编辑 2:我选择了 Vlad 的答案,因为他既提出了流行的解决方法,又部分解决了我提出的优化建议(在 David 的答案中)。感谢所有写答案的人——我都读了,没有一个明确的“赢家”。
另外,我发现一篇学术论文提出了与我的建议非常相似的优化:http://www.ebb.org/bkuhn/articles/cpp-opt.pdf。
【问题讨论】:
-
编译器可能知道足以将虚函数查找优化为一次性命中。
-
没错,但这仍然会留下(更大?)非内联函数调用的开销,对吧?
-
是的,但缺少机器代码检测可能无法实现。
-
为什么?我试图在我的问题的最后一部分解释为什么我认为它应该是可能的——这对你有任何意义吗?
-
这个也许可以,但很难说。我相当怀疑编译器会生成这样的代码,因为它不能保证在你正在编写的类的其他子类不存在的情况下工作。
标签: c++ gcc inline virtual-functions