【问题标题】:Does the compiler optimize the second condition in "for" statement?编译器是否优化了“for”语句中的第二个条件?
【发布时间】:2017-04-18 03:22:14
【问题描述】:

我希望通过索引遍历一个向量,然后我有:

for(size_t i=0;i<v.size();++i)
{...}

我知道使用迭代器访问更有效,但我只是想在编译器优化的技术点上讨论。

我的问题是这个“v.size()”是只执行一次还是多次?

或者,编译器将帮助我决定是否需要通过任何优化策略计算大小是否足够一次,或者是否需要多次调用——这样我就不必:

size_t s=v.size()
for(size_t i=0;i<s;++i)

让代码更有效率?

【问题讨论】:

  • 没有任何保证。该标准不要求编译器这样做,也不禁止它这样做。所以它完全取决于你的编译器。您必须通过检查反汇编来验证它。或者只是相信它会做正确的事。
  • 我的经验是它每次都运行。
  • 一般来说,如果你想看看优化器会做什么,去godbolt并输入你的代码。

标签: c++ loops for-loop optimization


【解决方案1】:

我的问题是这个“v.size()”是只执行一次还是多次?

它被执行多次,每次循环体执行完毕,检查它是否应该再次执行。

如果不多次调用size(),编译器可能会也可能不会优化代码,这取决于编译器。

如果编译器可以保证你没有在循环中修改v,那么是的,编译器完全有可能对其进行优化。如果它不能,那么它可能(如果是,那么编译器是坏的)不会并且不能优化它,因为编译器会生成一些完全不同的代码你写的。

此外,即使编译器不对其进行优化,您也可能会节省 1 或 2 个 CPU 周期,这实际上不算什么。 size()O(1),调用它除了从向量中返回一个成员变量之外别无他法。不要过早优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2014-05-23
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2011-03-18
    相关资源
    最近更新 更多