deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

C++23 implicit move kurallarını genişletiyor, std::move artık daha da nadiren gerekiyor

Andreas Fertig'in Hacker News ana sayfasına çıkan yazısı, copy elision ve C++23'ün genişletilmiş implicit move kurallarının C++ dönüşlerinde hem kopyalamayı hem de açıkça std::move kullanımını nasıl gereksiz kıldığını anlatıyor.

C++23 implicit move kurallarını genişletiyor, std::move artık daha da nadiren gerekiyor

1 Eylül 2026'da yayımlanan ve Hacker News ana sayfasına taşınan Andreas Fertig imzalı bir blog yazısı, modern C++'ta açık std::move dönüşümlerine nadiren ihtiyaç duyulduğunu — ve C++23'ün hâlâ gerek duyulan son boşlukları da kapattığını savunuyor.

Move in C++ without a std::move başlıklı yazı, Fertig'in std::move'un tutumlu kullanılması gerektiğine dair önceki tavsiyesine dayanıyor. Yazar, derleyicinin zaten kendi başına ne yaptığını ve dil kurallarının nerede yeni yetiştiğini adım adım anlatıyor.

Kopyalama eleme (copy elision) move'dan önce gelir

Fertig'e göre gereksiz kopyalar bu tür kodlardaki en maliyetli hatalar arasında ve en güçlü savunma bir move değil, copy elision. Return value optimization (RVO) altında döndürülen nesne fonksiyonun stack'inde değil, doğrudan çağrı noktasında oluşturulur; böylece ne kopyalama ne de move yapılır. Ayrıca standardın bunu hiçbir zaman bir optimizasyon olarak sunduğunu değil, copy elision olarak tanımladığını da belirtiyor.

C++17'den itibaren bir fonksiyon saf bir temporary döndürdüğünde eleme garanti altındadır:

cpp Apple RVO() { return {}; }

Apple res{} gibi bir yerel değişkenin döndürüldüğü isimli varyant NRVO bu garanti kapsamında değildir; ancak Fertig, pratikte burada da genellikle ne kopyalama ne de move maliyeti ödediğinizi not ediyor.

Geride kalan durumlar

Move, eleme uygulanmadığında devreye giren çözümdür ve C++11 bazı dönüşleri zaten örtük olarak taşıyordu: Apple Fun(Apple val) { return val; } örneğindeki gibi değerle alınan bir parametrenin döndürülmesi, parametreyi kopyalamak yerine move eder.

İki diğer biçim daha karmaşıktı. İlki, rvalue reference alan ve alınan nesneyi değerle döndüren fonksiyondur:

cpp Apple Cat(Apple&& val) { return val; }

Fertig'in yazdığına göre C++20'den önce bu kod derleniyordu ama GCC gibi standarda uygun bir derleyicide bir kopya kurulumu üretiyordu; kendisinin burada daha az standarda uygun diye nitelediği Clang ise zaten move yapıyordu. Yani kuralları esneten derleyici tesadüfen daha iyi sonucu veriyordu.

Öne çıkardığı ikinci durum ise, kendi tanımıyla, rvalue reference parametresinden rvalue reference döndüren fonksiyon. Bu kod daha önce, dönüş değerini elle move etmediğiniz sürece derlenmiyordu ki bu da açık dönüşümlerden kaçınma tavsiyesiyle doğrudan çelişiyordu.

C++23 modunda ne değişiyor

Ana mesaj derleyicinin dil moduyla ilgili. C++23'e geçildiğinde, Fertig'in bildirdiğine göre, her iki sorunlu durumda da ortada hiç std::move olmadan örtük bir move gerçekleşiyor. Her iki örnekte de en iyi sonuç için eskiden gerekli olduğunu söylediği manuel dönüşüm atılabiliyor ve std::move'u az kullan kuralı, rvalue reference parametrelerinden dönüşleri de kapsayacak şekilde genişliyor.

Neden önemli

C++ geliştiricileri için kazanç, ekstra kod gerektirmeyen performanstır. Bir string, vector ya da büyük bir struct döndürürken kazara derin bir kopyadan kaçınılıp kaçınılmadığı tam da bu inceliklere bağlı olabilir ve yoğun geçen bir kod yolunda kopya ile move arasındaki fark önemli olabilir. Yazı ayrıca bir taşınabilirlik tuzağını da belgeliyor: kural değişikliğine kadar aynı kaynak kod bir büyük derleyicide move, bir başkasında kopya üretebiliyordu ve davranış standarttan çok derleyicinin esnekliğine bağlı kalıyordu. C++23 modunda derleme bu belirsizliği ortadan kaldırıyor ve ekiplerin return ifadelerindeki gürültülü dönüşümleri temizlemesine olanak tanıyor. Özet rehber: mümkünse temporary döndürün ki eleme garanti olsun, geri kalan yerlerde örtük move'lara güvenin ve std::move'u dilin zaten doğru şeyi yapmadığı nadir durumlar için saklayın.

  • #c-plus-plus
  • #move-semantics
  • #compilers
  • #performance
  • #language-standards