2012-11-07 35 views
5

STL uygulamaları için birkaç kaynağa bakıyordum (SGI, STLport, libC++) ve tüm uygulamaların çoğunda ortak olan birkaç tasarım deseni gördüm, ama hiçbir neden bulamadım. örneğin 2 sınıfları olarak uygulanmıştır, diğerleri arasında vector ve list_iterator dahilTasarım mantığının arkasında STL

  1. Birçok sınıflar,: Ben orada iyi tınlama olabilir ve ne olduğunu bilmek ister gerekir varsayalım list_iterator_base, işlevselliğin bir parçası ve list_iterator, list_iterator_base arabiriminin geri kalanıyla devralınır. Amaç ne? Bir sınıfta kolayca jut yapılabilirmiş gibi görünüyor.

  2. Yineleyiciler, iterator sınıfından yararlanmadılar. Kullanmak için bazı performans cezası var mı?

Sadece hızlı bir yağsızlıkla karşılaştığım 2 soru var. Bir STL uygulamasının uygulama mantığını açıklayan iyi bir kaynak bilen varsa, bunu duymaktan mutluluk duyarım.

+0

"Jumbo karides". –

+0

Teknik olarak STL ve standart kitaplığın (stdlib) farklı olduğunu unutmayın. İkincisi, çoğunlukla resmi dil standardına eklendiğinde, eskiden türetilmiştir. Neredeyse hiç kimse "gerçek" STL'yi artık kullanmaz, bunun yerine standart kütüphanenin uygulamalarını kullanır (ör. LibC++). STDlib'e birçok kişi STL olarak başvurur ve bu genelde iyidir, fakat sorunuz için bu ayrım anlamını değiştirir. – GManNickG

+0

@DaveNewton Yorumunuzu anlamıyorum. – baruch

cevap

7

cevaplar yalındır oldukça şunlardır:

  1. STL tüm jenerik programlama ile ilgili. Anahtar fikir, yinelenen kodun olmaması. Anında amaç, kaynak kodunun çoğunun olmamasıdır, ancak ortaya çıktığı gibi, ikili kodu çoğaltmamak da mantıklıdır. Bu nedenle, STL bileşenlerinin yaygın olarak kullanılan parçaları dışarıda bırakıp kullanması oldukça yaygındır. Bir liste sınıfının bağlantıları veya bir vektörün bağımsız tür özellikleri sadece iki örnektir. Vektörler için birden fazla katman bile vardır: bazı parçalar tamamen türden (örn., Boyut), diğerleri sadece kendisinin türüne (örneğin, tüm erişimciler, yineleyiciler, vb.) Ihtiyaç duyar ve bazı bölümlerin nasıl olduğunu bilmesi gerekir. Kaynak tahsisi ile ilgilenmek (örneğin, kullanılan ayırıcı hakkında bilmek için ekleme ve imha etme ihtiyaçları).
  2. std::iterator<...>'un gerçekten işe yaramadığı ortaya çıkıyor: Şablon parametrelerine bağlı olarak temel sınıflarda tanımlanan türler, bu tür bir tabandan türeyen sınıf şablonunda doğrudan erişilemez. Yani, türlerin temel sınıfla kalifiye olmaları ve typename kullanılarak tip olarak işaretlenmesi gerekir. Daha da kötüsü yapmak için, kullanıcılar teoride türetilmiş sınıfın nesnelerini tahsis edebilir ve std::iterator<...> işaretçisiyle serbest bırakabilirler (evet, bu aptalca bir şey olurdu). Yani, herhangi bir yararı yoktur ama potansiyel bir dezavantajdır, yani, en iyi şekilde önlenir.

Bu, jenerik kütüphaneleri uygulama tekniklerini kapsayan iyi bir kaynağın farkında değilim. STL uygulamalarında uygulanan detayların çoğu, birden fazla kişi tarafından bağımsız olarak icat edilmiştir, ancak Genel Programlama ile ilgili literatür hala nispeten azdır. STL'yi anlatan yazılardan herhangi birinin aslında uygulama tekniklerini tartıştığını sanmıyorum: Normalde tasarım detaylarına yoğunlaşıyorlar. Sadece çok az kişinin STL'nin neyle ilgili olduğunu anladığı düşünüldüğünde, yazarların STL'nin nasıl uygulanacağından ziyade ne olduğunu açıklamaya yoğunlaşmaları büyük bir sürpriz değildir.

+0

2. noktaya gelince: Çalışmıyorsa, neden etrafta kalsın? Neden standart kütüphaneye eklendi? – baruch