C++'ta move semantics nedir? Aşağıdaki kodda hangi constructor'lar çağrılır?

Cevap

Move semantics, geçici veya artık kullanılmayacak bir nesnenin kaynaklarını (heap bellek, dosya handle'ı) kopyalamak yerine devralmayı sağlar. T&& (rvalue reference) parametre alan move constructor ve move assignment ile uygulanır. std::move hiçbir şey taşımaz; sadece nesneyi rvalue'ya cast eder.

struct Mesh {
    std::vector<float> verts;
    Mesh() = default;
    Mesh(const Mesh& o) : verts(o.verts) { puts("copy"); }
    Mesh(Mesh&& o) noexcept : verts(std::move(o.verts)) { puts("move"); }
};

Mesh Make() { Mesh m; return m; }

int main() {
    Mesh a;
    Mesh b = a;             // copy
    Mesh c = std::move(a);  // move  (a artık geçerli ama belirsiz durumda)
    Mesh d = Make();        // genelde hiçbir şey (NRVO), olmazsa move
    std::vector<Mesh> v;
    v.push_back(Mesh());    // move (geçici nesne)
}

Çıktı tipik olarak: copy, move, move (NRVO uygulanınca Make için çıktı yok).

Önemli noktalar:

  • Move constructor'ı noexcept işaretleyin; aksi halde std::vector yeniden boyutlanırken güvenlik için kopyalamayı seçer.
  • return std::move(local); yazmayın; copy elision'ı engeller.
  • Taşınan nesne (moved-from) yok edilebilir ve yeniden atanabilir olmalıdır; değerine güvenilmez.
  • Rule of 0/3/5: Kaynak yöneten sınıflar ya hepsini (copy/move ctor, copy/move assign, destructor) tanımlar ya da hiçbirini (üyeler RAII ise derleyicinin ürettikleri yeterli).
  • Unreal'da karşılığı MoveTemp()'tir; TArray ve FString move'u destekler.

Oyunda faydası: Büyük mesh, texture verisi veya komut buffer'larını loader thread'den ana thread'e aktarırken bellek kopyasından kaçınmak.

  1. Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?ZorUnreal & C++Game Dev
  2. Cache-friendly veri yapısı ne demektir? Array of Structs (AoS) ile Struct of Arrays (SoA) farkı nedir?ZorUnreal & C++Game Dev
  3. C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?OrtaUnreal & C++Game Dev
  4. Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?ZorUnreal & C++Game Dev
  5. Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?OrtaUnreal & C++Game Dev
  6. TSharedPtr, TUniquePtr, TWeakPtr ve TWeakObjectPtr arasındaki farklar nelerdir?OrtaUnreal & C++Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle