用现在的编译器尽量减少对对象属性的读取有意义吗
Is it meaningful to minimize reading the properties of objects with nowadays compilers?
考虑一下这些代码片段。
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限定的,这将使事情变得容易得多。在这种情况下,您可能会相信编译器会做出正确的决定。但是,如果你真的很担心它,当你知道它是安全的时,可以使用第二种方法,或者反汇编输出以确保你的编译器按照你的意愿进行。
相关文章:
- 类对象属性是否可以调用返回属性应具有的值的方法C++?
- 对象属性同级访问
- 迭代 Napi::对象属性(键)在 Node.js C++ N-API 中
- 是否可以在C++(17)中捕获某些对象属性的破坏性赋值事件
- 分配以下对象属性在哪里
- sutex作为对象属性和对象的向量
- C++ - 在类中包含不是类对象属性的变量是否是一种不好的做法
- 根据对象属性从列表中删除对象
- 将对象属性替换为列表
- 查找对象属性是否位于对象向量C++中
- 未知EABI对象属性44
- 按矢量中的对象属性合并排序
- 如何访问带有静态回调的对象属性
- c++中对象属性的内存分配
- 为什么对象属性的值在 c++ 中将其指针添加到映射后返回零
- 如何检查对象属性更新是否存在 std::map 键,否则插入一个新键?
- 从ASP.NET应用程序查询Active Directory对象属性将返回旧结果
- 性能对象属性与范围变量
- 无法访问对象属性
- 如何从对象方法中访问对象属性