SORU
23 Mayıs 2013, PERŞEMBE


Neden sonra taşımak mı?

Birisi bir nesneyi kopyalamak için karar verdi bir yerde kod ve daha sonra bir sınıf veri üyesi için hareket ettiğini gördüm. Bu hareket bütün mesele kopyalama önlemek için olduğunu düşündüm şaşkınlık içinde bıraktı. İşte bir örnek:

struct S
{
    S(std::string str) : data(std::move(str))
    {}
};

Burada benim sorular:

  • Neden str rvalue-referans almıyoruz?
  • Bir kopyasını pahalı, özellikle std::string gibi bir şey vermiş olmayacak mı?
  • Yazar, bir hamle sonra bir kopyasını yapmak için karar verecek nedeni ne olabilir sizce?
  • Ne zaman bu işi kendim yapmalıyım?

CEVAP
23 Mayıs 2013, PERŞEMBE


Sorularınıza cevap vermeden önce, yanlış bilgi sahibi olmak için tek bir şey: C 11 değeri alarak her zaman kopyalama anlamına gelmez. Eğer bir rvalue geçildi, o olacaktaşındı(uygun hareket bir kurucu bulunması koşuluyla) yerine kopyalanan. Ve std::string hareket bir kurucu var.

C 03 C 11'de sık sık parametre değeri almak deyimsel bunun aksine, bu nedenlerden dolayı aşağıda anlatacağım. Ayrıca Bkz parametrelerini kabul etmek için nasıl kurallar daha genel bir dizi this Q&A on StackOverflow.

Neden str rvalue-referans almıyoruz?

Bu imkansız lvalues gibi geçmesine neden olur:

std::string s = "Hello";
S obj(s); // s is an lvalue, this won't compile!

Eğer S sadece rvalues kabul eden bir kurucu olsaydı, yukarıdaki derleme.

Bir kopyasını pahalı, özellikle std::string gibi bir şey vermiş olmayacak mı?

Eğer bir rvalue geçirirseniz, o olacaktaşındıstr, ve sonunda data taşınmış olacaktır. Hayır kopyalama yapılacaktır. Eğer bir lvalue geçirirseniz, diğer taraftan, bu lvalue olacakkopyalanan12 ** data taşındı.

Bu yüzden, iki hamle rvalues için sonuç olarak, bir kopyasını ve bir lvalues için hareket.

Yazar, bir hamle sonra bir kopyasını yapmak için karar verecek nedeni ne olabilir sizce?

İlki her zaman bir kopyası değildir; ve bu dedi yukarıda bahsettiğim gibi öncelikle, cevap: "Verimli (std::string nesneleri hareket ettirir ucuz ve basit çünkü".

Taşır ucuz varsayımı altında (SSO gözardı ederek), bu tasarım genel verimliliğini göz önüne alındığında hemen hemen göz ardı edilebilir. Eğer biz bunu, biz bir kopyasını lvalues (gibi oluruz eğer kabul ettik bir lvalue başvuru const) ve kopya için rvalues (iken biz hala bir kopya olmadığını kabul ettik bir lvalue başvuru için const).

Bu değer alarak lvalues sağlandığında const lvalue referans alarak ne kadar iyi olduğu ve rvalues sağlandığında daha iyi anlamına gelir.

P. S.: bir bağlam sağlamak İçin, this is the Q&A OP dir inanıyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • Trulia

    Trulia

    29 Kasım 2006