类方法调用是否会在for循环中进行优化
Will the class method call be optimized out in the for loop?
代码
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至少现在有了一些编译标志的模块间优化,这也可能跨越源文件边界。对其他编译器一无所知。
相关文章:
- gcc 如何优化此循环?
- 循环比较(优化)
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 优化在网格图中查找哈密尔循环的函数?
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 在循环条件中调用const vector size()似乎缺少优化
- GCC 优化了基于固定范围的 for 循环,就好像它具有更长的可变长度一样
- 通过循环展开和阻塞进行优化
- 为什么 CLang++ 不优化循环,而 G++ 优化循环?
- 嵌套循环 C++ 的优化
- 如何在卷积程序的 c++ 中优化嵌套循环
- G 4.8.5带负数组索引的循环优化错误
- 使用 OpenMP 优化外循环并减少
- C是否优化了循环的检查部分
- 如何分析优化的代码并加快循环
- 如何优化循环/if语句的C
- 使用for_each标准或提升工具优化循环
- 在模板专门化中优化循环和避免代码重复
- 矢量化/优化循环,用于宽寄存器(特别是Xeon Phi)的未对齐数据访问
- 使用GCC优化C/ c++循环中的嵌套if语句