CodeBlanks Logo Icon CodeBlanks

Move vs copy

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

main.cpp
#include <iostream>
#include <string>

int main() {
    // a dizisini tanımla, std::move ile b'ye taşı ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#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

Soru
Buffer(Buffer&& ____) noexcept : data(other.data), size(other.size) { other.data = nullptr; }
Cevap
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?

main.cpp
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.

Uzman bölümündeki tüm dersler