使用现在的编译器最小化读取对象的属性是否有意义?

时间:2014-04-09 00:44:03

标签: c++

请考虑以下代码段。

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。

2 个答案:

答案 0 :(得分:3)

如果f1以某种方式修改v,则存在他们不一定做同样事情的问题。如果v是局部变量(因此不能被f1修改),那么为两者生成的代码可能是相同的。如果f1以某种方式修改v,那么(2)可能会有未定义的行为,因为迭代器在调用f2之前失效。

所以一般来说,(1)可能同样快速和安全......

答案 1 :(得分:0)

我可能会说。函数调用的唯一方法是自动优化,如果编译器可以毫无疑问地保证结果不会改变,并且它们没有任何其他副作用。

当然,手动进行优化的唯一原因是你自己知道这是真的。那么问题就变成,编译器比你聪明吗?这是可能的,但我不会总是指望它。在某些情况下,编译器无法对函数进行任何保证,例如当它驻留在外部库中时。在这种情况下,编译器不可能执行这样的优化。

在使用迭代器getter显示的示例中,函数可能是内联的并且是const限定的,这会使事情变得更容易。在这样的情况下,你可以相信编译器做出正确的决定。但是,如果你真的非常担心它,要么在你知道它是安全的时候使用第二种方法,要么反汇编输出以确保你的编译器按你想要的那样。