auto
sessiz örtük dönüşümlerden kaçınarak performansa yardımcı olabilir . Zorlayıcı bulduğum bir örnek şudur.
std::map<Key, Val> m;
// ...
for (std::pair<Key, Val> const& item : m) {
// do stuff
}
Hatayı gördün mü? Burada, haritadaki her öğeyi const referansı ile zarif bir şekilde aldığımızı ve niyetimizi netleştirmek için yeni aralık ifadesini kullandığımızı düşünüyoruz, ancak aslında her öğeyi kopyalıyoruz . Çünkü std::map<Key, Val>::value_type
öyle std::pair<const Key, Val>
değil std::pair<Key, Val>
. Böylece, (örtük olarak) sahip olduğumuz zaman:
std::pair<Key, Val> const& item = *iter;
Varolan bir nesneye başvuru yapmak ve bunu ona bırakmak yerine bir tür dönüştürme yapmak zorundayız. Kullanılabilir bir örtük dönüştürme olduğu sürece farklı türde bir nesneye (veya geçici) bir const referansı almanıza izin verilir, örneğin:
int const& i = 2.0; // perfectly OK
Tip dönüşüm bir dönüştürebilirsiniz aynı nedenle izin verilen bir örtülü dönüşüm const Key
bir etmek Key
, ama biz bunun için izin vermek için yeni tip bir geçici inşa etmek gerekir. Böylece, döngümüz etkili bir şekilde yapar:
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
(Tabii ki, aslında bir __tmp
nesne yok, sadece örnekleme için var, gerçekte isimsiz geçici item
yaşamı boyunca bağlı ).
Sadece şuna değiştiriliyor:
for (auto const& item : m) {
// do stuff
}
bize bir ton kopya kaydetti - şimdi referans verilen tür başlatıcı türüyle eşleşiyor, bu yüzden geçici veya dönüşüm gerekli değil, sadece doğrudan bir referans yapabiliriz.