【发布时间】:2020-08-31 14:28:10
【问题描述】:
在 C++11 中,我们可以在迭代容器时使用更简单的“for”循环,如下所示:
for (auto i : {1, 2, 3, 4})
...;
但是,我不知道此类代码的效率。具体来说:
- {1、2、3、4} 的类型是什么?是原始数组,还是转换成std::vector等其他容器?
- 编译器会展开循环吗?
更新:假设我们使用-O2,循环中的代码只是几个操作。 就我而言,我想列举四个方向 UP DOWN LEFT RIGHT 并使用方向参数调用一个函数。我只关心程序是否能有最好的性能。
非常感谢!
【问题讨论】:
-
编译器会展开循环吗? 这取决于你在循环中做了什么。您可以使用godbolt.org 来探索各种编译器会做什么。
-
编译器会展开循环吗?取决于编译器、优化级别以及可能的其他因素。我不知道循环展开有任何保证。
-
"{1, 2, 3, 4} 的类型是什么?"它是
std::initializer_listen.cppreference.com/w/cpp/utility/initializer_list -
你真的关心编译器是否展开循环吗?还是您只关心生成的可执行文件的性能?那些不一样。通常编译器在决定何时应用优化和何时不应用优化方面要好得多
-
@zbh2047:测量、优化、测量。在你确定存在问题之前不要担心这样的微优化在特定的代码中。大多数时候性能取决于高级算法的效率,而不是某个循环是否被编译器展开。