是否会在for循环中优化类方法调用?

时间:2011-10-06 23:05:47

标签: c++ optimization

for (size_t i = 0; i < myClassObject.Method(); ++i)
  some work;

我想知道编译器是否会优化方法调用并将其转换为此?

size_t result = myClassObject.Method();
for (size_t i = 0; i < result; ++i
  some work;

如果是函数调用会不会有问题?我担心的是,我可能会对该方法执行1000次不必要的调用,但我更喜欢在条件中使用方法调用来编写它。

3 个答案:

答案 0 :(得分:4)

您应该在代码中说明您想要做什么。如果你需要一笔金额,你就不会编写代码而不是仅仅因为你喜欢这样做而添加的代码。它需要一个智能编译器来实现对Method()的调用没有副作用,并且正文循环不会以任何方式直接或间接地修改Method()中使用的参数。

我个人的偏好是,为了做我想做的事情并按照我喜欢的方式写下来,是:

for (size_t i = 0, result = myClassObject.Method(); i < result; ++i )
   some work;

答案 1 :(得分:4)

这取决于编译器是否可以证明调用的结果不可能在循环体中发生变化,因此不要依赖它。如果你想明确地进行提升,编写它的标准方法是这样的:

for (std::size_t i = 0, end = myClassObject.Method(); i != end; ++i)
{
  // ...
}

这同样适用于基于迭代器的循环。

答案 2 :(得分:1)

作为一项规则,这将是一个不正确的优化,因为该方法可能不会在每次调用时返回相同的结果。考虑它是否返回当前时间。

如果方法定义在同一个编译单元中(在包含的头文件或相同的源文件中),它很简单,编译器就可以告诉它始终返回相同的结果,然后可能获得此优化。我认为如果声明inline方法,则特别有可能。

我相信gcc至少现在有一些模块间优化和一些编译标志,也可以跨源文件边界进行。不知道其他编译器。