SORU
13 ŞUBAT 2011, Pazar


C 11 rvalues ve hareket semantik karışıklık (geri bildirimi)

Rvalues başvuruları anlamak ve C 11 semantiği hareket etmeye çalışıyorum.

Bu örnekler arasında ne fark var ve hangisi hiçbir vektör kopyasını yapacak

İlk örnek

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

İkinci örnek

std::vector<int>&& return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Üçüncü örnek

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Teşekkürler !

CEVAP
13 ŞUBAT 2011, Pazar


İlk örnek

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> &&rval_ref = return_vector();

İlk örnek rval_ref tarafından yakalanan bir geçici döndürür. Bu geçici hayat rval_ref tanımı ötesine geçmişti ve eğer değer yakaladı varmış gibi kullanabilirsiniz. Bu aşağıdaki çok benzer:

const std::vector<int>& rval_ref = return_vector();

yeniden benim dışında mı belli olmayan sabit bir şekilde rval_ref kullanamaz.

İkinci örnek

std::vector<int>&& return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

İkinci örnekte, çalıştırma hatası oluşturduk. rval_ref artık işlev içinde tahrip tmp için bir başvuru içerir. Herhangi bir şans ile, bu kod hemen çökebilir.

Üçüncü örnek

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return std::move(tmp);
}

std::vector<int> &&rval_ref = return_vector();

Üçüncü örnek, ilk Aşağı Yukarı eşit sayılır. Std::tmp hareket gereksiz ve aslında geri dönüş değeri iyileştirme engellemek gibi bir performans pessimization olabilir.

Yaptığın kod için en iyi yoldur:

En iyi uygulama

std::vector<int> return_vector(void)
{
    std::vector<int> tmp {1,2,3,4,5};
    return tmp;
}

std::vector<int> rval_ref = return_vector();

I. e. C 03 yaptığınız gibi. tmp örtülü olarak return ifadesi bir rvalue olarak kabul edilir. Olur da iade yoluyla geri dönüş değeri optimizasyonu (kopyalama, taşıma), ya da eğer derleyici karar verir değil gerçekleştirmek rvt li, sonra kullanmak vektör hareket oluşturucu için geri dönün. Eğer rvt li gerçekleştirilirse sadece, eğer iade edilen türde bir saldırı kurucu var mıydı yoksa kopya kurucu dönüş için kullanılacaktır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • John Lynn

    John Lynn

    8 Ocak 2010
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009