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

  • BigDawsTv

    BigDawsTv

    20 HAZİRAN 2012
  • boburnham

    boburnham

    11 Temmuz 2006
  • tsweeney79

    tsweeney79

    21 Ocak 2008