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::vectoryeniden 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;TArrayveFStringmove'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.
İlgili Unreal & C++ soruları
- Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?
- Cache-friendly veri yapısı ne demektir? Array of Structs (AoS) ile Struct of Arrays (SoA) farkı nedir?
- C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?
- Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?
- Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?
- TSharedPtr, TUniquePtr, TWeakPtr ve TWeakObjectPtr arasındaki farklar nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.