Bazı bölgelerde (örneğin oyun endüstrisi) biliyorum, STL önerilmez. Yani sorum şu: bazı durumlarda STL kullanmamak gerçekten iyi bir uygulama mı? Öyleyse, modern C ++ 'ın STL'sini kullanmamanın en büyük nedenleri nelerdir?
Bazı bölgelerde (örneğin oyun endüstrisi) biliyorum, STL önerilmez. Yani sorum şu: bazı durumlarda STL kullanmamak gerçekten iyi bir uygulama mı? Öyleyse, modern C ++ 'ın STL'sini kullanmamanın en büyük nedenleri nelerdir?
Yanıtlar:
Sadece bir geçerli sebep düşünebilirim ve bu çok nadir: Zor gerçek zamanlı. Standart kütüphanedeki birçok şey hafızayı dahili olarak ayırır ve bu, gerçek zamanlı zor uygulamalar için yeterince belirleyici değildir, bu nedenle bunlardan kaçınılmalıdır. Bu uygulamalar genellikle oldukça basittir, ancak çok titiz inceleme ve testler nedeniyle gelişmeleri orantısızdır.
Geçersiz, ancak çok yaygın bir neden düşünebilirim: Hesaplama karmaşıklığını anlamayan, STL'yi kötüye kullanan ve kütüphaneyi suçlayan geliştiriciler.
STL, çalışma zamanında genellikle ya geri arama işaretçileri olan C tarzı çözümlerden ya da sanal yöntemlerle polimorfizm tabanlı çözümlerden daha hızlıdır ( ayrıca bkz. Bu Bjarne Stroustrup'un açılış notu ). Ancak, geliştirici verilen karmaşıklık özelliklerini anlamadığında ve bazı karmaşık nesnelerin vektörlerinin vektörü gibi bir şey oluşturarak kütüphaneyi kötüye kullandığında (C ++ 11'de artık bir sorun değildir!), Performans sorununa neden olur ve kendilerini savunur "gördüğünüz gibi, vektörler oldukça yavaştır", standart kütüphanenin yavaş olduğu algısına neden olabilir. Ve yöneticiler böyle bir algı aldığında, organizasyonda çok uzun yaşayabilir.
Açıkçası, hedeflediğiniz platformun desteklemediği bir şey kullanamazsınız. Ancak şu anda en yaygın dört mobil platformlar (Android, iOS Bada ve eski WinCE) hedefleyen ve standart kütüphane ve bazı parçaları kullanın edilmektedir Boost hepsinde.
Standart kütüphanenin çoğu, Microsoft tarafından WinCE'nin başında desteklenmiyordu (IIRC iostreams yalnızca Visual Studio 2005 ile çıktı), ancak bunun yerine çok önce STLport kullanmak mümkün oldu . Ve genellikle bunu herhangi bir şeye derlemek için alabilirsiniz. Ben de bu nedenle geçersiz diyeceğim.
Ayrıca, oldukça uzun bir süre "STL" değil, ANSI C ++ Standart Kütüphanesi. Dilin kendisini tanımlayan aynı standart belge ile tanımlanır. Bunu desteklemeyen hiçbir şey C ++ olarak adlandırılmayı hak etmiyor.
sprintf
genellikle bellek ayırır. Gerçek zamanlı platformlarda, standart kütüphane işlevlerinin de belirleyici sınırları vardır. Bu, gerçek zamanlı C ++ uygulamalarını zorlaştırır: Küçük bir C standart kitaplığından daha fazla iş olan tüm bir C ++ standart kitaplığını dikkatlice geliştirmeniz gerekir.
Uzun yıllardır STL ve güçlendirmeyi kullanıyorum. Onu terk edip özel aletlerimi kullanmak istersem, motivasyon şöyle olurdu:
C ++ standart şablon kütüphanesini kullanmamanın büyük bir geçerli nedeni var: Hedef platformlarınızdan birinin tam olarak uyumlu bir uygulaması yok (veya hiç uygulaması yok) ve bir tane almayacağını biliyorsunuz önümüzdeki yıllarda.
Karmaşıklık (uygulama verimliliği) hakkında bilmiyorum ama std olanlar yerine Qt kapları ve dizeleri yaygın olarak kullanıyorum ve iyi çalışıyorlar. Ayrıca setlerin ve listelerin Qt uygulamasının kullanımını daha kolay buluyorum.
Dolayısıyla, ihtiyaçlarınıza uygun başka bir kütüphane kullanabiliyorsanız STL'den vazgeçmek pratik olabilir.
QList<T>::iterator
Patrick, STL'nin tamamını kullanmamanın nedeninden bahsetti , yani platformlarınızda bir tane yok.
Sonuçta sorunun noktayı kaçırdığını düşünüyorum. Çoğunlukla ya hep ya hiç bir karar değil, seç ve seç. Kapsayıcılar ve algoritmalar ile gitmeye karar verebilir, ancak dizeler ve i / o için Std Lib dışında bir şey kullanmaya karar verebilirsiniz.
Ağır bir neden olmadığı sürece pratik değildir. Düşünebileceğim bu nedenlerden bazıları, STL'nin (veya standart kütüphanenin herhangi bir bölümünün) sadece kısmi veya eksik uygulamasını veya etrafta dolaşmanız gereken bir kaynak sınırlamasını (bellek, CPU hızı, depolama, ...) içerir. gerçekleştirmeniz gereken şeylere uygun kendi araçlarınızı yuvarlayın.
Oyun endüstrisinde çoğu (hatta bir dereceye kadar küçük) stüdyoların iç kütüphaneleri ve hedef platform için yüksek düzeyde uyarlanmış ve bazı durumlarda engnie hatta oyunun kendisini hedefleyen birçok standart kütüphane parçası uygulamaları vardır. Basitçe söylemek gerekirse konsollar için bir oyun geliştirirken donanım günümüz standartlarına göre çok sınırlıdır. Bir nedenden ötürü binlerce ve binlerce el yapımı montaj hattı var. Kodunuzdaki her türlü kaynak ayak izini en aza indirgemek çok önemlidir, böylece oyun daha hızlı çalışır, bu da oyun dünyasında (veya daha büyük bir dünyada) daha iyi bir ürün elde edilmesini sağlar.
"Her başarılı oyun, kendi bağlantılı liste uygulamanızı başlatarak başlar."