我希望通过索引遍历一个 vector ,然后我有:
for(size_t i=0;i<v.size();++i)
{...}
我知道用iterator访问比较有效,但我只是想在编译器优化的技术点上讨论。
我的问题是这个“v.size()”是只执行一次还是多次?
或者,编译器将帮助我决定是否需要通过任何优化策略计算大小一次,或者是否需要多次调用——这样我就不必:
size_t s=v.size()
for(size_t i=0;i<s;++i)
让代码更高效一点?
最佳答案
My question is does this "v.size()" execute only once or multiple times?
它被执行多次,每次循环体执行完,检查是否应该再次执行。
如果不多次调用 size()
,编译器可能会或可能不会优化代码,这仅取决于编译器。
如果编译器可以保证你没有在循环中修改v
,那么是的,编译器完全有可能对其进行优化。如果不能,那么它可能(如果可以,那么编译器是坏的)不会并且不能优化它,因为编译器随后会生成完全不同的代码你写的。
此外,即使编译器没有优化它,您也可能会节省 1 或 2 个 CPU 周期,这实际上没什么。 size()
是 O(1)
,调用它除了从 vector 中返回一个成员变量外不应做任何其他事情。不要过早优化。
关于c++ - 编译器是否优化了 "for"语句中的第二个条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945358/