Move vs copy
- C++ kursu
- Uzman
- Ders 29/47
- 5 dk
Move ve copy semantiğinin performans farkını öğrenirsin.
Move vs copy
Copy bir nesnenin kaynağını çoğaltır; move kaynağı olduğu gibi devralır. Büyük bir diziyi kopyalamak pahalıdır; taşımak ise ucuzdur çünkü yalnızca işaretçi aktarılır.
C++11'den itibaren move constructor ve std::move vardır. std::move(a) aslında taşıma yapmaz; a'yı rvalue'ya çevirir, böylece move constructor seçilir. Taşıma sonrası kaynaklanan nesne geçerli ama belirsiz duruma gelir; genellikle nullptr olur.
std::move ile taşıma
std::move bir lvalue'yu rvalue'ya çevirir. Bu, derleyicinin move constructor seçmesini sağlar. Örnek: std::string a = "Merhaba"; std::string b = std::move(a);. Burada b a'nın içeriğini devralır; a boş duruma gelir.
Taşıma sonrası a'nın durumu belirsizdir ama geçerlidir; yıkıcısı güvenle çalışır. Büyük verilerde (std::vector, std::string) move, copy'den çok daha ucuzdur; çünkü yalnızca üç işaretçi/boyut aktarılır, elemanlar tek tek kopyalanmaz.
Uygulama std::string'i std::move ile taşı
main içinde std::string a = "Merhaba"; tanımla. Sonra std::string b = std::move(a); yaz. En son std::cout << b; yaz.
Başlangıç kodu
#include <iostream>
#include <string>
int main() {
// a dizisini tanımla, std::move ile b'ye taşı ve yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
int main() {
std::string a = "Merhaba";
std::string b = std::move(a);
std::cout << b;
return 0;
}Beklenen çıktı
Merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Move constructor parametresini tamamla
Buffer(Buffer&& ____) noexcept : data(other.data), size(other.size) { other.data = nullptr; }
Buffer(Buffer&& other) noexcept : data(other.data), size(other.size) { other.data = nullptr; }
Açıklama: other, taşınan kaynağın adıdır.
2 Aracı rolüne eşle
| Kavram | Anlamı |
|---|---|
copy constructor |
Kaynak çoğaltır |
move constructor |
Kaynağı devralır |
std::move |
Lvalue'yu Rvalue'ya çevirir |
noexcept |
İstisna garantisi |
3 std::move ne yapar?
std::string b = std::move(a);- Lvalue'yu Rvalue'ya çevirir, move constructor seçilir Doğru cevap
- Yeni bir kopya oluşturur
- Nesneyi siler
- Kaynağı fiziksel olarak taşır
Açıklama: std::move yalnızca cast yapar; gerçek taşıma move constructor yapar.