我可以看到为什么auto
C ++ 11中的类型可以提高正确性和可维护性。我已经读过它也可以提高性能(Herb Sutter的Always Always Auto),但是我错过了一个很好的解释。
auto
提高性能?auto
可以避免隐式隐式转换,从而提高性能。我发现一个令人信服的例子如下。
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
看到错误了吗?在这里,我们认为我们正在通过const引用优雅地获取地图中的每个项目,并使用新的range-for表达式使我们的意图明确,但实际上我们正在复制每个元素。这是因为std::map<Key, Val>::value_type
是std::pair<const Key, Val>
,没有std::pair<Key, Val>
。因此,当我们(隐式)拥有:
std::pair<Key, Val> const& item = *iter;
不必引用现有对象并将其留在那儿,我们必须进行类型转换。只要存在隐式转换,就可以对其他类型的对象(或临时对象)进行const引用,例如:
int const& i = 2.0; // perfectly OK
该类型转换是可以转换一个同样的原因被允许的隐式转换const Key
的Key
,但我们必须建立一个临时的新型的,以允许这一点。因此,有效地,我们的循环可以做到:
std::pair<Key, Val> __tmp = *iter; // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
(当然,实际上没有__tmp
对象,它只是用于说明,实际上,未命名的临时对象在item
其生命周期中一直受到约束)。
只是更改为:
for (auto const& item : m) {
// do stuff
}
刚刚为我们节省了很多副本-现在引用的类型与初始值设定项类型匹配,因此不需要临时或转换,我们可以直接进行引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句