C++ 在当今的编译器中,最小化对象属性的读取是否有意义?
考虑这些代码片段 1.C++ 在当今的编译器中,最小化对象属性的读取是否有意义?,c++,C++,考虑这些代码片段 1. vector<int> v; f1(v.begin(), v.end()); f2(v.begin(), v.end()); vector<int> v; auto begin = v.begin(); auto end = v.end(); f1(begin, end); f2(begin, end); 向量v; f1(v.开始(),v.结束()); f2(v.开始(),v.结束()); 2. vector<int> v;
vector<int> v;
f1(v.begin(), v.end());
f2(v.begin(), v.end());
vector<int> v;
auto begin = v.begin();
auto end = v.end();
f1(begin, end);
f2(begin, end);
向量v;
f1(v.开始(),v.结束());
f2(v.开始(),v.结束());
2.
vector<int> v;
f1(v.begin(), v.end());
f2(v.begin(), v.end());
vector<int> v;
auto begin = v.begin();
auto end = v.end();
f1(begin, end);
f2(begin, end);
向量v;
自动开始=v.开始();
自动结束=v.结束();
f1(开始,结束);
f2(开始,结束);
在当今的编译器中,进行第二种编译有什么性能优势吗?让我们想象一下,这不是f1和f2,而是fN。如果f1以某种方式修改了
v
,则它们不一定做相同的事情。如果v
是一个局部变量(因此不能由f1
修改),则为这两个变量生成的代码可能是相同的。如果f1
确实以某种方式修改了v
,那么(2)可能具有未定义的行为,因为迭代器在调用f2
之前已失效
所以一般来说,(1)可能同样快速和安全…我想说可能。能够自动优化函数调用的唯一方法是编译器能够毫无疑问地保证结果不会发生更改,并且不会产生任何其他副作用 当然,手动进行优化的唯一原因是如果您自己知道这是真的。所以问题变成了,编译器比你聪明吗?这是可能的,但我并不总是指望它。有些情况下,编译器无法对函数做出任何保证,例如当它驻留在外部库中时。在这种情况下,编译器不可能执行这样的优化
在您使用迭代器getter显示的示例中,函数可能是内联的,并且符合const条件,这将使事情变得更简单。在这种情况下,您可以相信编译器会做出正确的决定。但是如果你真的很担心它,或者在你知道它是安全的时候使用第二种方法,或者反汇编输出以确保你的编译器做你想做的事情。无论哪种方法,我认为第二种方法更具可读性。。。(如果您确实有
N个)