SORU
8 EKİM 2014, ÇARŞAMBA


Neden değer Ot kurucu üye fonksiyonları tavsiye alarak'In CppCon 2014-konuş (özümüze döndük: Modern C tipi) Sutter?

Herb Sutter'ın CppCon 2014 temellerine Geri konuşmak: Modern C Tarzı slayt 28 (a web copy of the slides are here) bu şablonu: ifade eder

class employee {
  std::string name_;
public:
  void set_name(std::string name) noexcept { name_ = std::move(name); }
};

, Noexcept-lik bir geçici güçlü değil bu set_name çağırırken çünkü sorunlu olduğunu söylüyor () (cümleyi kullanıyor "noexcept-ish").

Şimdi, ben kullanıyorum yukarıdaki desen oldukça ağır benim kendi son C kodu esas olarak, çünkü kurtarıyor beni yazarak iki kopya set_name() her zaman - evet, biliyorum bu biraz verimsiz tarafından zorlama bir kopyasını inşaat her zaman, ama hey ben bir tembel Peki. Ancak Bitki cümlesi "Bu noexceptsorunlu" beni endişelendiriyor olarak anlamadım sorun burada: std::string hareket atama operatörü noexcept gibi, kendi yıkıcı, çok set_name() yukarıdaki gibi görünüyor bana garanti noexcept. Olası bir durum derleyici tarafından at görüyorumönceparametre hazırlar gibi) set_name, ama o kadar sorunlu görmek için mücadele ediyorum.

Daha sonra slayt üzerinde 32 Herb açıkça yukarıda anti-deseni olduğunu belirtir. Biri tembel olmanın kötü kod yazıyorum diye bana nedenini açıklayabilir mi?

CEVAP
9 EKİM 2014, PERŞEMBE


Diğerleri yukarıda noexcept muhakeme kaplı.

Ot verim yönleri hakkında konuşmak çok uzun sürmüş. Sorun gereksiz deallocations ile ayırma, onun değil. Bir kopya, başka bir kopyası rutin içine std::string kopyalanan veri tutmak için yeterli boş alan varsa orada hedef dize ayrılmış depolama yeniden. Hareket bir atama yaparken hedef dize mevcut depolama üzerinde kaynak dizesi saklamak alır gibi ayırmanın gerekir. "Kopyala ve taşı" deyim geçici geçemezsin bile her zaman ortaya çıkar, kaldırma kuvvetleri. Bu daha sonra konuşma içinde gösterilen kötü performans kaynağıdır. Onun tavsiyesini yerine sabit bir ref almak ve eğer ihtiyacınız belirlerseniz r-değeri başvurular için bu bir aşırı yüklenme var. Bu size hem en iyi dünyalar: kopyalayın varolan depolama için olmayan geçici kaçınarak kaldırma ve taşıma için geçici nereye gidiyorsun ödemek için bir kaldırma öyle ya da böyle (ya da hedef kaldırır önce hareket veya kaynağı kaldırır sonra kopya).

Yukarıdaki üye ayırması için değişken depolama yok beri kurucular için geçerli değildir. Bunu yapmanız gerekiyorsa kurucular genellikle birden fazla argüman alır ve r-değeri sabit ilan no/ref aşırı her argüman için yapıcı aşırı patlamalı bir patlama ile sona beri güzel.

Şimdi soru olur: kaç ders std gibi depolama yeniden vardır::kopyalanırken dize? Öyle tahmin ediyorum std::vector, ama bunun dışında emin değilim. Böyle depolama yeniden bir sınıf yazdım biliyorum, ama dizeleri ve vektörler içeren sınıflar çok yazdım. Aşağıdaki Bitki tavsiyesi sana zarar vermeyeceğim için sınıfları yok yeniden depolama, olacaksın kopyalama ilk kopyalama sürümü lavabo işlevi ve eğer düşündüğünüz kopyalama çok fazla bir performans vuracaksın sonra da bir r-değeri referans aşırı yüklenmesini önlemek için kopya (sadece senin için std::string). Öte yandan, kullanarak "kopyala-taşı" var bir performans gösterdi vurmak için std::string ve diğer türleri yeniden depolama, ve bu tür muhtemelen görmek çok kullanılan en halklar kodu. Ben aşağıdaki Bitki tavsiyesi için şimdi, ama gerek sanırım bazılarına bu daha önce düşündüğüm konu tamamen yerleşmiş (muhtemelen bir blog yazısı buna vaktim yok yazmak için pusuya yatmış hepsi bu).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CaliforniaMetin

    CaliforniaMe

    3 ŞUBAT 2013
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009
  • Theodore Leaf

    Theodore Lea

    29 AĞUSTOS 2006