SORU
10 EYLÜL 2015, PERŞEMBE


C kullanımı 11'In 'oto' performansı artırabilir?

C 11 auto türü doğruluğu ve sürdürülebilirliği artırır anlayabiliyorum. Ayrıca performans (Almost Always Auto Herb Sutter tarafından) geliştirmek okudum, ama iyi bir açıklama özledim.

  • Nasıl auto performansı artırabilir?
  • Herkes bir örnek verebilir mi?

CEVAP
10 EYLÜL 2015, PERŞEMBE


auto performans yardımcı olabilirsessiz örtülü dönüşüm kaçınarak. Çekici bulduğum bir örnek şudur.

std::map<Key, Val> m;
// ...

for (std::pair<Key, Val> const& item : m) {
    // do stuff
}

Böceği gördün mü? Burada, zarif bir şekilde sabit başvuru ile haritanın her eşyayı almak ve bizim niyet açıklığa kavuşturmak dizi için yeni bir ifade kullanıyoruz, ama aslında kopyalama olduğumuzu düşünüyoruzhereleman. Bu std::map<Key, Val>::value_type std::pair<const Key, Val>, std::pair<Key, Val> değil çünkü. Biz (örtülü olarak) sonuç:

std::pair<Key, Val> const& item = *iter;

Varolan bir nesneye bir başvuru almak ve o bırakmak yerine, bir tür dönüşüm yapmak zorundayız. Bir nesne (veya) geçici farklı bir tür için sabit bir referans örtülü bir dönüştürme gibi özellikleri de vardır, örneğin: acele etme hakkınız vardır

int const& i = 2.0; // perfectly OK

Bu tür dönüştürme, bir izin örtük dönüştürme için aynı sebepten dönüştürebilirsiniz const Key Key, ama biz inşa etme geçici bu yeni türü için izin ver. Böylece, etkin bir döngü 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 __tmp bir nesne, sadece gösterim amacıyla, gerçekte isimsiz sadece geçici kullanım ömrü için item bağlı) yok.

Sadece değiştirme:

for (auto const& item : m) {
    // do stuff
}

sadece geçici veya dönüşüm gerekli diye kopya bir ton - şimdi başlatıcı tür maçları başvurulan türü kaydedilmiş, sadece doğrudan bir başvuru yapabiliriz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • listedabive

    listedabive

    30 Ocak 2007
  • TeachMeComputer

    TeachMeCompu

    31 EKİM 2009