请考虑以下代码段。
1
vector<int> v;
f1(v.begin(), v.end());
f2(v.begin(), v.end());
2
vector<int> v;
auto begin = v.begin();
auto end = v.end();
f1(begin, end);
f2(begin, end);
现在编译器在第二次执行时是否有任何性能优势?让我们想象它不是f1和f2,而是fN。
答案 0 :(得分:3)
如果f1
以某种方式修改v
,则存在他们不一定做同样事情的问题。如果v
是局部变量(因此不能被f1
修改),那么为两者生成的代码可能是相同的。如果f1
以某种方式修改v
,那么(2)可能会有未定义的行为,因为迭代器在调用f2
之前失效。
所以一般来说,(1)可能同样快速和安全......
答案 1 :(得分:0)
我可能会说。函数调用的唯一方法是自动优化,如果编译器可以毫无疑问地保证结果不会改变,并且它们没有任何其他副作用。
当然,手动进行优化的唯一原因是你自己知道这是真的。那么问题就变成,编译器比你聪明吗?这是可能的,但我不会总是指望它。在某些情况下,编译器无法对函数进行任何保证,例如当它驻留在外部库中时。在这种情况下,编译器不可能执行这样的优化。
在使用迭代器getter显示的示例中,函数可能是内联的并且是const限定的,这会使事情变得更容易。在这样的情况下,你可以相信编译器做出正确的决定。但是,如果你真的非常担心它,要么在你知道它是安全的时候使用第二种方法,要么反汇编输出以确保你的编译器按你想要的那样。