相关疑难解决方法(0)

将动态类型从循环中提升(也称为C++方式的Java)

我最近与一些朋友讨论了"现代"语言与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++显然允许您查询动态函数指针并存储它.

澄清:我感兴趣的主要用例是基类和带循环的函数(如累加器)是单独的翻译单元或库的一部分,并且没有对派生类的控制或知识.

c++ virtual

15
推荐指数
2
解决办法
711
查看次数

标签 统计

c++ ×1

virtual ×1