用现在的编译器尽量减少对对象属性的读取有意义吗

Is it meaningful to minimize reading the properties of objects with nowadays compilers?

本文关键字:对象 属性 读取 有意义 编译器      更新时间:2023-10-16

考虑一下这些代码片段。

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。

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

所以总的来说,(1)可能同样快速和安全。。。

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

当然,手动进行优化的唯一原因是,如果您自己知道这是真的。所以问题来了,编译器比你聪明吗?这是可能的,但我并不总是指望它。有些情况下,编译器无法对函数做出任何保证,比如当它驻留在外部库中时。在这种情况下,编译器不可能执行这样的优化。

在您展示的迭代器getter示例中,函数可能是内联的,并且是const限定的,这将使事情变得容易得多。在这种情况下,您可能会相信编译器会做出正确的决定。但是,如果你真的很担心它,当你知道它是安全的时,可以使用第二种方法,或者反汇编输出以确保你的编译器按照你的意愿进行。