Bjarne Stroustrup'un C++'ı sıfır-maliyetli soyutlamalar etrafında nasıl şekillendirdiğini ve performans kritik yazılımların neden hâlâ kontrolü, araçları ve ekosistemi için ona güvendiğini öğrenin.

cpp\nint add_tax(int price) { return price * 108 / 100; }\n\n\nçoğu zaman derleme sonrası hiç çağrı olmadan hale gelir. "Fonksiyona atla, argümanları ayarla, dön" yerine derleyici aritmetiği kullandığınız yere yapıştırabilir. Soyutlama (anlamlı bir isimli fonksiyon) fiilen ortadan kaybolur.\n\nDöngüler de dikkat çeker. Bitişik aralık üzerinde basit bir döngü optimizer tarafından dönüştürülebilir: sınır kontrolleri gerektiği kanıtlanırsa kaldırılabilir, tekrarlanan hesaplamalar döngü dışına taşınabilir ve döngü gövdesi CPU'yu daha verimli kullanacak şekilde yeniden düzenlenebilir.\n\n### “Ortadan kaybolan soyutlama”\n\nBu, sıfır-maliyetli soyutlamaların pratik anlamıdır: daha anlaşılır kod elde edersiniz ve kullandığınız yapının kalıcı bir çalışma zamanı maliyeti ödemezsiniz.\n\n### Takaslar\n\nHiçbir şey bedava değildir. Daha ağır optimizasyonlar ve daha fazla “kaybolan soyutlama” daha uzun derleme süreleri ve bazen daha büyük ikili dosyalar anlamına gelebilir (örneğin birçok çağrı yeri inline edildiğinde). C++ size derleme maliyeti ile çalışma zamanı hızı arasında denge seçme sorumluluğunu verir.\n\n## RAII: Otomatik Temizlikle Güvenlik ve Hız\n\nRAII (Resource Acquisition Is Initialization) basit bir kuraldır ve büyük sonuçları vardır: bir kaynağın ömrü bir scope ile ilişkilidir. Bir nesne oluşturulduğunda kaynağı edinir. Nesne kapsam dışına çıktığında yıkıcı onu serbest bırakır—otomatik olarak.\n\nBu “kaynak” bellek, dosyalar, mutex kilitleri, veritabanı tutamaçları, soketler, GPU tamponları ve daha fazlası olabilir. Her dönüş yolunda close(), unlock() veya free() çağırmayı hatırlamak yerine temizlemeyi tek bir yere (yıkıcıya) koyar ve dil bunu garanti eder.\n\n### Neden RAII sıklıkla manuel temizlemeden daha hızlı ve güvenlidir\n\nManuel temizlik genellikle “gölge kodu” üretir: ekstra if kontrolleri, çoğaltılmış return işlemleri ve her başarısızlık sonrası dikkatle yerleştirilmiş temizleme çağrıları. Bir dalı atlamak kolaydır, özellikle fonksiyonlar geliştikçe.\n\nRAII genellikle düz çizgili kod üretir: edin, işi yap, kapsam çıkışı temizliği halleder. Bu hem sızıntıları (leaks), çift serbest bırakmaları hem de unutulmuş kilitleri azaltır ve savunmacı defter tutma nedeniyle oluşan çalışma zamanı yükünü azaltır. Performans açısından sıcak yoldaki daha az hata işleme dalı, daha iyi talimat önbelleği davranışı ve daha az yanlış yönlendirilmiş dal tahmini anlamına gelebilir.\n\n### Öngörülebilir performans—ve daha az sürpriz\n\nSızıntılar ve bırakılmamış kilitler sadece “doğruluk sorunları” değildir; performans için zaman bombalarıdır. RAII kaynak serbest bırakmayı öngörülebilir kılar, bu da sistemlerin yük altında stabil kalmasına yardımcı olur.\n\n### İstisnalar hakkında dikkatli bir not\n\nRAII istisnalarla birlikte parlıyor çünkü yığın açılımı sırasında yıkıcılar çağrılır, böylece kaynaklar beklenmedik şekilde kontrol akışı değişse bile serbest bırakılır. İstisnaların maliyeti kullanım şekline ve derleyici/platform ayarlarına bağlıdır. Temel nokta, RAII'nin bir scope'tan çıkışın nasıl olursa olsun temizliği belirli kılmasıdır.\n\n## Şablonlar ve El Yapımı Kadar Çalışan Genel Kod\n\nŞablonlar genellikle “derleme zamanında kod üretimi” olarak tanımlanır ve bu yararlı bir zihinsel modeldir. Bir algoritmayı bir kere yazarsınız—örneğin “bu öğeleri sırala” veya “öğeleri bir konteynere depola”—ve derleyici kullandığınız kesin tiplere özel bir versiyon üretir.\n\n### Derleme zamanında özelleştirme (runtime faturası olmadan)\n\nDerleyici somut tipleri bildiği için fonksiyonları inline edebilir, doğru işlemleri seçebilir ve agresif optimizasyon yapabilir. Birçok durumda bu, virtual çağrılardan, runtime tip kontrollerinden ve “genel” kodu çalıştırmak için gerekebilecek dinamik dispatch'tan kaçınmak anlamına gelir.\n\nÖrneğin, tamsayılar için şablonlanmış bir max(a, b) birkaç makine talimatına dönüşebilir. Aynı şablon küçük bir struct ile kullanıldığında bile doğrudan karşılaştırmalar ve taşımalar olarak derlenebilir—arayüz işaretçileri yok, runtime tür kontrolü yok.\n\n### Zaten kullandığınız genel programlama\n\nStandart Kütüphane şablonlara güçlü şekilde dayanır çünkü bunlar iyi test edilmiş yapı taşlarını gizli işler olmadan yeniden kullanılabilir kılar:\n- ve gibi konteynerler 'nizi doğrudan saklar.\n- gibi algoritmalar, karşılaştırılabilir oldukları sürece birçok veri türü üzerinde çalışır.\n- İteratörler aynı algoritmanın vektörler, diziler ve özel koleksiyonlar üzerinde çalışmasını sağlayan “yapıştırıcıdır”.\n\nSonuç, çoğu zaman el yazımı, tipe özel bir versiyon gibi performans gösteren koddur—çünkü fiilen öyle olur.\n\n### Takaslar\n\nŞablonlar geliştiriciler için bedava değildir. Derleme sürelerini uzatabilir (daha fazla kod üretmek ve optimize etmek gerekir) ve bir şeyler ters gittiğinde hata mesajları uzun ve anlaşılması zor olabilir. Takımlar genellikle kodlama yönergeleri, iyi araç zinciri ve şablon karmaşıklığını fayda getiren alanlarda tutma yoluyla bunu idare ederler.\n\n## STL: Gizli İş Olmadan Yeniden Kullanılabilir Yapı Taşları\n\n, sıfır-maliyetli fikir etrafında tasarlanmış C++'ın yerleşik araç kutusudur: daha üst düzey yapı taşları kullanırken yine de bunların sıkı makine talimatlarına derlenmesini sağlar. Bu ayrı bir çatı değildir—standart kütüphanenin parçasıdır ve kullanmadığınız işleri zorla yüklemeyecek şekilde tasarlanmıştır.\n\n### Üç sütun: konteynerler, algoritmalar, iteratörler\n\n- veriyi saklar: , , , , , ve daha fazlası.\n- öğe aralıkları üzerinde işler yapar: , , , , vb.\n- algoritmaların birçok konteyner tipi üzerinde ortak bir arayüzle çalışmasını sağlayan “yapıştırıcılardır”.\n\nBu ayrım önemlidir. Her konteynerin kendi “sort” veya “find” işlevini yeniden icat etmesi yerine, STL size derleme zamanında agresif şekilde optimize edilebilen bir dizi iyi test edilmiş algoritma sunar.\n\n### Doğru kullanıldığında verimlilik\n\nSTL kodu hızlı olabilir çünkü birçok karar derleme zamanında verilir. Bir üzerinde sıralama yaparsanız, derleyici eleman tipini ve iteratör tipini bilir, karşılaştırmaları inline edebilir ve döngüleri el yazımı gibi optimize edebilir. Anahtar, erişim deseninize uygun veri yapıları seçmektir.\n\n### Pratik konteyner rehberi (kesin yargılar yok) \n- : çoğunlukla varsayılan olmalıdır çünkü elemanlar bitişik bellektedir; iterasyon ve rastgele erişim için önbellek-dostudur ve hızlıdır. yalnızca gerçekten kararlı iteratörlere ve öğelerin taşınmadan çokça splice/ekleme gerektiğinde yardımcı olur—ancak düğüm başına maliyet öder ve dolaşma için daha yavaş olabilir.\n\n- : Anahtar ile hızlı ortalama durum aramaları için genellikle iyi bir seçimdir. anahtarları sıralı tutar; aralık sorguları (örn. “A ile B arasındaki tüm anahtarlar”) ve öngörülebilir yineleme sırası için yararlıdır, ancak aramalar genellikle iyi bir hash tablosundan daha yavaştır.\n\nDaha derin bir rehber için bkz: /blog/choosing-cpp-containers\n\n## Sıfır-Maliyet Hedefini Destekleyen Modern C++ Özellikleri\n\nModern C++ Stroustrup'un "cezasız soyutlama" fikrinden vazgeçmedi. Bunun yerine birçok yeni özellik, daha anlaşılır kod yazarken derleyicinin sıkı makine kodu üretebilmesine fırsat tanımaya odaklandı.\n\n### Taşıma (move) semantiği: sahipliği aktarırken kopyalardan kaçının\n\nYavaşlığın yaygın bir kaynağı gereksiz kopyalamadır—büyük stringleri, tamponları veya veri yapıları sadece dolaştırmak için çoğaltmak.\n\nTaşıma semantiği basitçe “eğer gerçekten bir şeyi veriyorsanız kopyalamayın” fikridir. Nesne geçici ise (veya ondan sonra işiniz bitmişse), C++ içeriğini yeni sahibine kopyalamak yerine aktarabilir. Günlük kodda bu genellikle daha az tahsis, daha az bellek trafiği ve daha hızlı yürütme demektir—baytları elle yönetmek zorunda kalmadan.\n\n### : daha erken hesapla, runtime daha az yapsın\n\nBazı değerler ve kararlar hiç değişmez (tablo boyutları, yapılandırma sabitleri, arama tabloları). ile C++'a belirli sonuçları derleme sırasında hesaplamasını isteyebilirsiniz; böylece çalışan program daha az iş yapar.\n\nFayda hem hız hem de basitliktir: kod normal bir hesaplama gibi okunabilir, sonuç ise sabit olarak “fırınlanmış” olabilir.\n\n### Ranges ve daha net yineleme (gizli iş olmadan) \nRanges (ve view gibi ilgili özellikler) “bu öğeleri al, filtrele, dönüştür” gibi ifadeleri okunaklı hale getirir. Doğru kullanıldıklarında bunlar zorunlu runtime katmanları olmadan basit döngülere derlenebilir.\n\n### Realist bir not: sıfır-maliyet bir hedef, garanti değil\n\nBu özellikler sıfır-maliyet yönünü destekler, ancak performans yine nasıl kullanıldıklarına ve derleyicinin nihai programı ne kadar iyi optimize edebildiğine bağlıdır. Temiz, üst düzey kod sık sık güzelce optimize edilir—ancak hız gerçekten önemliyse ölçmek hâlâ gereklidir.\n\n## Gerçek C++ Kodunda Performansın Kazanıldığı (veya Kaybedildiği) Yerler\n\nC++ üst düzey kodu çok hızlı makine talimatlarına derleyebilir—ancak bu varsayılan olarak hızlı sonuçlar garantilemez. Performans genellikle bir şablon veya temiz soyutlama kullanmanızdan değil, sıcak yollara küçük maliyetlerin sızmasından ve milyonlarca kez çarpılmasından kaybolur.\n\n### Kazara ek yükün yaygın kaynakları\n\nSıkça görülen desenler şunlardır:\n\n- (kısa ömürlü birçok nesne yaratmak) ve bunlarla ilgili gizli işler.\n- , özellikle konteynerler veya büyük structlar ile.\n- (her yerde işaretçiler, veriler birlikte saklanmıyor).\n- , derleyicinin çağrıyı inline etmesini zorlaştırır.\n- (iş parçacıkları kilitler, atomikler veya paylaşılan kuyruklar üzerinde yarıştığında), "hızlı kod" beklemekle zaman harcar.\n\nBunların hiçbiri "C++ problemi" değildir. Genellikle tasarım ve kullanım sorunlarıdır—ve her dilde olabilir. Fark, C++'ın bunları düzeltmek için yeterli kontrol vermesi ve aynı zamanda onları yaratmak için yeterli ipi sağlamasıdır.\n\n### Yardımcı kurallar (gerçekten işe yarayan) \nMaliyet modelini basit tutacak alışkanlıklarla başlayın:\n\n1. Önbellekler ve eşzamanlılık konusunda sezginiz sıklıkla yanılabilir.\n2. Bufferları yeniden kullanın, kapasite ayırın (), iç döngülerde geçici konteynerler oluşturmaktan kaçının.\n3. Birçok durumda "nesnelerin grafiği" yerine "şeylerin dizisi" daha iyidir.\n4. Inline edilebilir fonksiyonlar, öngörülebilir dallar ve minimum senkronizasyon yardımcıdır.\n\n### Profilleme, mistik olmayan şekilde\n\nZamanın nerede harcandığını, kaç tahsis yapıldığını ve hangi fonksiyonların en çok çağrıldığını cevaplayabilen bir profiler kullanın. Bunu ilginizi çeken parçalar için hafif benchmarklarla eşleştirin.\n\nBunu tutarlı şekilde yaptığınızda, “sıfır-maliyetli soyutlamalar” pratik hale gelir: okunabilirliği korur, sonra ölçümde ortaya çıkan özel maliyetleri ortadan kaldırırsınız.\n\n## Performans-Kritik Endüstrilerin Neden Hâlâ C++'ı Seçtiği\n\nC++, milisaniyelerin (veya mikro saniyelerin) yalnızca "iyi olur" değil, ürün gereksinimi olduğu yerlerde sıkça kullanılır. Düşük gecikmeli ticaret sistemleri, oyun motorları, tarayıcı bileşenleri, depolama motorları, gömülü firmware ve HPC iş yükleri örnekler arasındadır. Bunlar tek kullanım yerleri değil—ancak dilin neden sürdüğünü göstermeye yardımcı olurlar.\n\n### Öngörülebilir gecikme ve açık kontrol\n\nBirçok performans hassasiyeti olan alan, tepe veriminden çok önem verir: kare düşüşleri, ses kopmaları, kaçırılmış piyasa fırsatları veya gerçek zamanlı görevlerin kaçırılması gibi kuyruk gecikmeleri. C++ ekiplerin belleğin ne zaman ayrıldığını, ne zaman serbest bırakıldığını ve verinin bellekte nasıl düzenlendiğini seçmesine izin verir—bu seçimler önbellek davranışı ve gecikme sıçramalarını güçlü şekilde etkiler.\n\nSoyutlamalar basit makine koduna derlenebildiği için C++ kodu bakım yapılabilir şekilde yapılandırılabilir ve bu yapı için otomatik çalışma zamanı yükü ödemezsiniz. Ücret ödediğinizde (dinamik tahsis, virtual dispatch, senkronizasyon), genellikle görünür ve ölçülebilirdir.\n\n### Mevcut ekosistemlere uyum (özellikle C) \nPragmatik bir neden de birlikte çalışabilirliktir. Birçok kuruluşun on yıllık C kütüphaneleri, işletim sistemi arayüzleri ve olgun kodu vardır; hepsini yeniden yazamazsınız. C++ doğrudan C API'lerini çağırabilir, gerektiğinde C-uyumlu arabirimler sunabilir ve bir kod tabanını kademeli modernize etmenize izin verir.\n\n### Araçlar, donanım erişimi ve dağıtım gerçekleri\n\nSistem programlama ve gömülü çalışmada "metale yakın" olmak hâlâ önemlidir: komutlara, SIMD'e, bellek eşlemeli I/O'ya ve platforma özgü optimizasyonlara doğrudan erişim. Olgun derleyiciler ve profilleme araçlarıyla birleştiğinde, C++ genellikle ikili dosyaların, bağımlılıkların ve çalışma zamanı davranışının kontrolünü koruyarak performansı sıkıştırmak isteyen ekipler tarafından seçilir.\n\n## Zor Kısımlar: Karmaşıklık, Güvenlik ve Ekiplerin Nasıl Başa Çıktığı\n\nC++ sadakat kazanır çünkü son derece hızlı ve esnek olabilir—ama bu gücün bir maliyeti vardır. Eleştiriler yersiz değil: dil büyük, eski kod tabanları riskli alışkanlıklar taşıyor ve hatalar çöküşe, veri bozulmasına veya güvenlik sorunlarına yol açabiliyor.\n\n### Neden C++ zor gelebilir\n\nC++ on yıllar boyunca büyüdü ve bu belli olur. Aynı işi yapmanın birden çok yolu ve küçük hataları cezalandıran "keskin kenarlar" görürsünüz. İki sıkıntılı nokta: \n- şablonlar, overload'lar ve build sistemleri hata ayıklamayı ve işe almayı daha zorlaştırabilir.\n- bazı hatalar (geçersiz bellek okuma veya tip kurallarının ihlali gibi) güvenilir şekilde başarısız olmaz; bir derleyici güncellemesi veya yeni optimizasyon sonucu sonucu değiştirebilir.\n\nEski desenler riski artırır: ham /, manuel sahiplik yönetimi ve kontrolsüz işaretçi aritmetiği hâlâ eski kodda yaygındır.\n\n### Ekipler riski nasıl azaltır (mucize yokken) \nModern C++ pratiği büyük ölçüde faydaları elde ederken tetikleyicilerden kaçınmakla ilgilidir. Ekipler bunu benimseyerek yapar—mükemmel güvenlik vaadi olmadan, arızalanma biçimlerini azaltmanın pratik yolu olarak.\n\nYaygın yaklaşımlar: \n- RAII türleri ve standart konteynerleri (, ) ham tahsis yerine tercih edin.\n- Sahipliği açık hale getirmek için akıllı işaretçiler (, ) kullanın.\n- Uyarıları açın, ciddiye alın ve benzeri kuralları uygulayın.\n- Testlerde sorunları erken yakalamak için sanitizörler (AddressSanitizer, UndefinedBehaviorSanitizer) çalıştırın.\n- Girdi güvensizse statik analiz ve fuzzing ekleyin.\n\n### Gidişat\n\nStandart, daha güvenli, daha net koda doğru evrilmeye devam ediyor: daha iyi kütüphaneler, daha ifade edici tipler ve anlaşma/sözleşmeler, güvenlik rehberliği ve araç desteği üzerine devam eden çalışmalar. Takas aynı kalıyor: C++ size kaldıraç veriyor, ancak ekipler disiplin, incelemeler, test ve modern konvansiyonlarla güvenilirliği kazanmalı.\n\n## Pratik Karar Rehberi: Ne Zaman (ve Nasıl) C++'a Bahse Girilmeli\n\nC++ ince taneli performans ve kaynak kontrolüne ihtiyaç duyup disipline yatırım yapabileceğiniz zaman iyi bir yatırımdır. "C++ daha hızlıdır" demekten ziyade, "C++ hangi işin ne zaman ve hangi maliyetle yapılacağını kararlaştırmanıza izin verir" demektir.\n\n### C++ hangi durumlarda doğru seçimdir\n\nAşağıdakilerin çoğu doğruysa C++'ı seçin:\n\n- Gerçek gecikme, verim veya bellek sınırlarına sahipsiniz (gerçek zamanlı sistemler, ticaret, oyunlar, render, gömülü).\n- Donanım, OS API'leri veya mevcut C/C++ kütüphaneleriyle sıkı entegrasyon gerekiyor.\n- Başlangıç süresi ve öngörülebilir performans hızlı iterasyondan daha önemli.\n- Güvenliği ve testi birinci sınıf gereksinimler olarak ele alacak mühendisleri işe alabilirsiniz.\n\nBaşka bir dil düşünün eğer:\n\n- Geliştirici hızı, varsayılan olarak güvenlik ve daha basit dağıtım öncelikliyse (çok sayıda web backend, iç araçlar). Rust, Go, Java/Kotlin, C# veya Python riski azaltabilir.\n- Ekibinizin C++ deneyimi yoksa ve eğitim, araç ve inceleme için bütçe ayıramıyorsanız.\n- Tahsis, veri düzeni veya kuyruk gecikmesi konusunda kontrol ihtiyacınız yoksa.\n\n### Ekipler için pratik kontrol listesi\n\nC++'ı seçtiyseniz, erken kısıtlar koyun:\n\n- modern bir taban (C++17/20) benimseyin, RAII'yi tercih edin, ham 'i önleyin, sahipliği kasıtlı olarak / ile yönetin ve uygulama kodunda kontrolsüz işaretçi aritmetiğini yasaklayın.\n- yaşam süreleri/sahiplik, istisna güvenliği, gizli tahsisler, kopyalama vs taşıma, iş parçacığı güvenliği ve API açıklığı (kimin neyi sahip olduğu).\n- uyarıları hata sayın, sanitizörler (ASan/UBSan/TSan), statik analiz ve biçimlendirme.\n- temsilci iş yüklerini tanımlayın, değişiklik öncesi/sonrası ölçün, gecikme yüzdeliklerini takip edin (sadece ortalamalar değil) ve performans testlerini CI'ye ekleyin.\n\n### Basit bir öğrenme yolu\n\n1. değer tipleri, referanslar, RAII, standart kütüphane ve net arayüzler yazma.\n2. veri yapıları, önbellek dostu tasarım, tahsis stratejileri ve profilleme.\n3. şablonlar/genel programlama, eşzamanlılık primitifleri ve gerektiğinde derleyici çıktısını okumak.\n\nEğer seçenekleri değerlendiriyor veya göç planlıyorsanız, iç karar notlarını saklamak ve onları futuras çalışanlar ve paydaşlarla paylaşmak için /blog gibi bir takım alanında tutmak yardımcı olur.\n\n### Koder.ai bu resimde nerede duruyor\n\nPerformans kritik çekirdek C++'ta kalsa bile, birçok ekip çevresindeki ürün kodunu hızlıca teslim etmek zorundadır: panolar, yönetim araçları, iç API'ler veya düşük seviyeli uygulamaya geçmeden önce gereksinimleri doğrulayan prototipler.\n\nİşte bu noktada pratik bir tamamlayıcı olabilir. Sohbet arayüzünden web, sunucu ve mobil uygulamalar (webde React, backend'te Go + PostgreSQL, mobilde Flutter) oluşturmanıza izin veren bir vibe-coding platformudur; planlama modu, kaynak kodu dışa aktarma, dağıtım/barındırma, özel alan adları ve geri alma ile anlık görüntüler gibi seçenekler sunar. Başka bir deyişle: “sıcak yol” etrafındaki her şeyi hızlıca yineleyebilirken, C++ bileşenlerinizi sıfır-maliyetli soyutlamalar ve sıkı kontrolün gerçekten gerekli olduğu parçalara odaklayabilirsiniz.
“Sıfır-maliyetli soyutlama”, bir tasarım hedefidir: bir özelliği kullanmıyorsanız çalışma zamanında ek bir yük getirmemeli; kullanıyorsanız, üretilen makine kodu, düşük seviyeli el yazımı koda yakın olmalıdır.
Pratikte bu, daha anlaşılır kod (tipler, fonksiyonlar, genel algoritmalar) yazabilmeniz, ancak otomatik olarak ekstra tahsisler, dolaylı erişimler veya fazladan dispatch ile cezalandırılmamanız anlamına gelir.
Bu bağlamda “maliyet”, çalışma zamanında yapılan ek işler demektir; örneğin:
Amaç, bu maliyetleri görünür tutmak ve her programa zorunlu olarak yüklememektir.
Derleyicinin soyutlamayı derleme zamanında görebildiği durumlarda en iyi çalışır — küçük fonksiyonların inlinedığı, constexpr ile sabitlerin derlemede hesaplandığı ve şablonların somut tiplerle örneklendiği yaygın durumlar.
Aksine, çok fazla runtime indirection olduğu (ör. sıcak döngüde ağır virtual dispatch) veya sık tahsisler ve işaretçi tabanlı veri yapıları kullandığınız durumlarda bu yaklaşım daha az etkili olur.
C++ birçok gideri çalışma zamanından derleme zamanına kaydırır, böylece runtime daha yalın kalır. Tipik örnekler:
Bunlardan yararlanmak için optimizasyonlarla derleyin (örn. ) ve kodu derleyicinin akıl yürütebileceği şekilde tutun.
RAII, kaynak ömrünü bir scope'a bağlar: yapıcıda edinim, yıkıcıda serbest bırakma. Bellek, dosyalar, kilitler, soketler gibi temizlenmesi gereken her şey için kullanın.
Pratik alışkanlıklar:
std::vector, std::string) tercih edin.RAII, istisnalarla birlikte özellikle etkilidir çünkü yığın açılımı sırasında yıkıcılar çağrılır; bu sayede kaynaklar beklenmedik kontrol akışlarında bile serbest bırakılır.
Performans açısından, istisnalar genellikle fırlatıldıklarında pahalıdır, sadece mümkün olduklarında değil. Sıcak yolda sık sık fırlatılıyorsa hata kodlarına/expected-benzeri sonuçlara yönelmek gerekir; fırlatmalar gerçekten istisnaiyse, RAII ile birlikte istisnalar hızlı yolu basit tutar.
Şablonlar, derleme zamanında tipe özel kod ürettiği için genellikle inline ve runtime tip kontrollerinden kaçınmayı sağlar. Bu yüzden şablonlar el yazımı kod kadar hızlı çalışabilir.
Planlamanız gereken takaslar:
Şablon karmaşıklığını, getirdiği faydanın yüksek olduğu çekirdek algoritmalarda tutun ve uygulama bağlamında aşırı şablonlamadan kaçının.
Genel olarak std::vector'ı varsayılan olarak tercih edin: elemanlar bitişik bellekte saklanır, iterasyon ve rastgele erişim için önbellek dostudur. std::list yalnızca gerçekten kararlı iteratorlar ve ortada çok fazla taşıma olmadan parça ekleme/çıkarma gerektiğinde anlamlıdır, ancak düğüm başına ek maliyeti ve dolaşma maliyeti vardır.
Anahtar-değer haritaları için:
Gerçek C++ kodunda performansı çarpan hale getiren şeylere odaklanın:
reserve() kullanın)Sonrasında sezgi yerine profilleme ile doğrulayın.
Erken kısıtlar koyarak performans ve güvenliği kahramanlığa bırakmayın:
new/delete'i önleyinstd::vector\u003cT\u003estd::array\u003cT, N\u003eTstd::sortvectorstringarraymapunordered_maplistsortfindcounttransformaccumulatestd::vector\u003cint\u003evector vs listvectorlistunordered_map vs mapunordered_mapmapconstexprconstexprreserve()newdeletestd::vectorstd::stringstd::unique_ptrstd::shared_ptrclang-tidynew/deletestd::unique_ptrstd::shared_ptr-O2/-O3std::unordered_map.std::map.Daha derin bir rehber için: /blog/choosing-cpp-containers
std::unique_ptr / std::shared_ptr kontrollü kullanın)clang-tidy gibi kurallar uygulayınBu uygulamalar C++'ın kontrolünü korurken tanımsız davranış ve beklenmedik yükleri azaltmaya yardımcı olur.