SORU
29 EYLÜL 2011, PERŞEMBE


-By pass-değeri C 11 makul bir varsayım mı?

Geleneksel C , fonksiyonları ve yöntemleri içine değeriyle geçirmeden büyük nesneler için yavaş ve genellikle üzerine kaşlarını çattı. Bunun yerine, C programcıları eğilimi geçiş başvuruları etrafında, hangisi daha hızlı, ama hangi tanıtır her türlü karmaşık sorular mülkiyet ve özellikle geçici bellek yönetimi (olay nesne öbek ayrılmış)

Şimdi, C 11, biz Rvalue başvuruları ve hareket kurucular, yani bu mümkün uygulamak için bir büyük nesne (gibi bir std::vector) Bu ucuz geçerler değer ve işlev.

Bu varsayılan std::vector std::string gibi türleri örnekleri için değeri geçmesi gerekir mi demek oluyor? Ne için özel nesneler hakkında? Yeni en iyi uygulama nedir?

CEVAP
29 EYLÜL 2011, PERŞEMBE


Makul bir varsayılaneğervücudun içinde bir kopyasını yapmak gerekir. Bu Dave is advocating Abrahams nedir:

Kılavuz: kopyalama işlevi argüman Yok. Bunun yerine, değer onları geçmek ve derleyici kopyalama yapalım.

Kod bu demektir bunu yapma:

void foo(T const& t)
{
    auto copy = t;
    // ...
}

ama bunu yapmak için:

void foo(T t)
{
    // ...
}

arayan: foo kullanabilirsiniz avantajına sahip

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue

ve yalnızca çok az iş yapılır. Başvurular aynı şeyi iki aşırı ihtiyacın olacak, void foo(T const&); void foo(T&&);.

Bunu unutmayın, ben şimdi gibi değerli benim kurucular yazdı:

class T {
    U u;
    V v;
public:
    T(U u, V v)
        : u(std::move(u))
        , v(std::move(v))
    {}
};

Aksi takdirde, const referans geçerken hala makul.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christian Atlas

    Christian At

    26 Mart 2009
  • VJ VIMANA

    VJ VIMANA

    3 Mayıs 2007
  • Within Temptation

    Within Tempt

    18 EYLÜL 2006