selamlar, "Geliştirici Günlüğü" bölümünden gördüğüm kadarıyla metin2 developer arkadaşlar kodları bir tık yenileme eğiliminde, bu arkadaşlara bir kaç öneri ve kısaca bazı sebeplerini anlatacağım.
1: C Style Array to std::array
-> `std::array` c style arrayler ile aynı işlevleri görüp herhangi bir overhead içermez, memoryde contigous olarak sıralanır
-> parametreye argüman geçerken `array decay` uygulanmaz
-> c style arrayin sizeını alırken uzun syntaxtan ve olası hatalardan sizi member functionları sayesinde kurtarır(c++17'de gelen std::size fonksiyonu c style arraylerde kullanılabilir tabii)
-> random access iterator kategorisindedir, alakalı algoritmalar ile uyumludur
-> copy elisondan faydalanılabilir
-> "out of bound" kaynaklı undefined behavior durumlarına karşı "out_of_range" throw eder
-> tabii en önemlisi kodun Modern C++ ile uyumlu olması
Örnek:
2: char array to std::string
-> en önemlisi gereksiz allocate durumudur, sourceda gördüğüm çoğu char array ihtiyaç olandan çok çok daha fazlasıyla oluşturulmuş
-> unutulmaması gereken bir nokta std::string bir containerdır ve heap üzerinde allocation yapar.
-> tuttuğunuz yazı çok büyük değilse derleyici SSO(small string optimization) yapacak ve heapda alan tahsis edilmeyecek bu sebeple özellikle size olarak küçük stringlerde tercih edilebilir
-> random access iterator kategorisindedir, alakalı algoritmalar ile uyumludur
-> member functionlarda cabası
3: std::bind optimization
-> alakalı yazıya paylaştığım bu konudan ulaşabilirsiniz;
4: Rule of Zero uyumu
-> kaynak yöneten bir classınız yoksa bırakın ctor ve assignment operatörlerinizi implicitly olarak derleyiciniz yazsın, siz yazmayın
5: C++ sürümü
-> bence minimum base artık C++17 hatta 20(belki) olmalıdır, 10+ sene önce release edilmiş sürümleri kullanmayın
6: string_view
-> özellikle parametrelerde tavsiye ederim, sizi gereksiz kopya maliyetinden kurtaracaktır
-> c style string(const char*) ve std::string ile uyumludur
-> verilen yazının başlangıç adresini ve sizeını tutmasından ötürü kullanımına dikkat edilmeli
-> uzun uzun yazmayayım ama ne kadar faydalı olsa da undefined behaviora sebep olabilecek durumlara dikkat edilmeli
tabii bunlar sadece 3-5 ufak trick, şimdiye kadar gördüklerime örnek verdim. C++ için ciddi bir eğitim ve tecrübe(tabii 5+ yıllık "developer" kişilerin bunlardan bihaber olduğu oluyor, siz herkesin peşinden koşmayın) gerekir, herkes C++ yazabilir ama bu dilde uzmanlık farklı bir konudur. burda bütün konuların olması mümkün değil metin2 iş dışında müsait oldukça sourcesine baktığım bir yazılım, bir şeyler gördükçe veya aklıma geldikçe düzenleme yapar veya yorum olarak eklerim.
1: C Style Array to std::array
-> `std::array` c style arrayler ile aynı işlevleri görüp herhangi bir overhead içermez, memoryde contigous olarak sıralanır
-> parametreye argüman geçerken `array decay` uygulanmaz
-> c style arrayin sizeını alırken uzun syntaxtan ve olası hatalardan sizi member functionları sayesinde kurtarır(c++17'de gelen std::size fonksiyonu c style arraylerde kullanılabilir tabii)
-> random access iterator kategorisindedir, alakalı algoritmalar ile uyumludur
-> copy elisondan faydalanılabilir
-> "out of bound" kaynaklı undefined behavior durumlarına karşı "out_of_range" throw eder
-> tabii en önemlisi kodun Modern C++ ile uyumlu olması
Örnek:
C++:
// c style
static const int lowerBox[] = { 50197, 50198, 50199 };
// std::array
static constexpr std::array<int, 3U> lowerBox{50197, 50198, 50199};
2: char array to std::string
-> en önemlisi gereksiz allocate durumudur, sourceda gördüğüm çoğu char array ihtiyaç olandan çok çok daha fazlasıyla oluşturulmuş
-> unutulmaması gereken bir nokta std::string bir containerdır ve heap üzerinde allocation yapar.
-> tuttuğunuz yazı çok büyük değilse derleyici SSO(small string optimization) yapacak ve heapda alan tahsis edilmeyecek bu sebeple özellikle size olarak küçük stringlerde tercih edilebilir
-> random access iterator kategorisindedir, alakalı algoritmalar ile uyumludur
-> member functionlarda cabası
3: std::bind optimization
-> alakalı yazıya paylaştığım bu konudan ulaşabilirsiniz;
std::bind derleme ve çalışma zamanında fazladan yüktür(overhead) ve moderncpp ile artık "never use" kategorisindedir. update gibi bir fonksiyonda yapılan işlemin lambda ile değiştirmek derleyiciye optimizasyon şansı tanıyacaktır, runtime & compile time yükünü azaltacaktır, birden fazla yerde var göz gezdirdiğim kadarıyla, benzer işlemi tüm bindlara uygulamanızı öneririm. debug açısından lambdalar anonim oldukları için compilerın yazdığı closure type isimlendirmesi karmaşıktır(tamamen compilera bağlı), debug edecek olursanız buna dikkat edin(breakpoint vs gibi araçlar boşuna var...
- 0x23
- Yanıt: 0
- Forum: C++ / C# / Python
4: Rule of Zero uyumu
-> kaynak yöneten bir classınız yoksa bırakın ctor ve assignment operatörlerinizi implicitly olarak derleyiciniz yazsın, siz yazmayın
5: C++ sürümü
-> bence minimum base artık C++17 hatta 20(belki) olmalıdır, 10+ sene önce release edilmiş sürümleri kullanmayın
6: string_view
-> özellikle parametrelerde tavsiye ederim, sizi gereksiz kopya maliyetinden kurtaracaktır
-> c style string(const char*) ve std::string ile uyumludur
-> verilen yazının başlangıç adresini ve sizeını tutmasından ötürü kullanımına dikkat edilmeli
-> uzun uzun yazmayayım ama ne kadar faydalı olsa da undefined behaviora sebep olabilecek durumlara dikkat edilmeli
tabii bunlar sadece 3-5 ufak trick, şimdiye kadar gördüklerime örnek verdim. C++ için ciddi bir eğitim ve tecrübe(tabii 5+ yıllık "developer" kişilerin bunlardan bihaber olduğu oluyor, siz herkesin peşinden koşmayın) gerekir, herkes C++ yazabilir ama bu dilde uzmanlık farklı bir konudur. burda bütün konuların olması mümkün değil metin2 iş dışında müsait oldukça sourcesine baktığım bir yazılım, bir şeyler gördükçe veya aklıma geldikçe düzenleme yapar veya yorum olarak eklerim.
Son düzenleme: