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

Will the class method call be optimized out in the for loop?

本文关键字:优化 循环 for 调用 是否 类方法      更新时间:2023-10-16

代码

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次不必要的调用,但我更喜欢在条件中使用方法调用来编写它。

你应该在代码中说明你想做什么。如果你需要求和,你不会因为喜欢而写乘法而不是加法的代码。它需要一个智能编译器来实现对Method()的调用没有副作用,并且主体的循环不会以任何方式直接或间接修改Method()中使用的参数。

我个人的偏好是:

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

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

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

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

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

如果方法定义在同一编译单元中可用(在包含的头文件或同一源文件中(并且编译器告诉它总是返回相同的结果很简单,那么您可能会得到此优化。我认为,如果方法被声明为inline,这种情况尤其可能发生。

我相信gcc至少现在有了一些编译标志的模块间优化,这也可能跨越源文件边界。对其他编译器一无所知。