我最近与一些朋友讨论了"现代"语言与C++相比的优点,当时出现以下内容(我认为受Java启发):
是否有任何C++编译器优化了循环中的动态调度?如果没有,是否存在任何允许作者强制(或强烈鼓励)这种优化的结构?
这是一个例子.假设我有一个多态层次结构:
struct A { virtual int f() { return 0; } };
struct B : A { virtual int f() { return /* something complicated */; } /*...*/ };
Run Code Online (Sandbox Code Playgroud)
现在我有一个累积的循环f():
int acc(const A * p, unsigned int N)
{
int result = 0;
for (unsigned int i = 0; i != N; ++i)
result += p->f(); // #1
return result;
}
Run Code Online (Sandbox Code Playgroud)
在此函数中,动态调度p->f()似乎发生在循环的每一轮中.然而,公然发送(?)的最终目标不能改变.
问题:编译器是否优化了此动态调度?如果没有,有没有办法重写代码来强制进行优化,或者至少让编译器识别出来?有没有好的测试代码可以告诉我这是否已经优化了?
我对语言和实现答案感兴趣,例如"根据标准这是不可能的",或者"是的,MSVC使用选项/xyzzy".
一些比较性评论:显然,Java会在适当的情况下优化甚至内联内部循环中的调用.Objective-C++显然允许您查询动态函数指针并存储它.
澄清:我感兴趣的主要用例是基类和带循环的函数(如累加器)是单独的翻译单元或库的一部分,并且没有对派生类的控制或知识.