C ++ Standardı neden ifade şablonlarını benimsemedi?


17

Bir teknik olarak ifade şablonlarının 1998'deki orijinal C ++ Standardından önce önemli ölçüde keşfedildiğini anladım. Neden std::stringve akışlar gibi çeşitli standart sınıfların performansını iyileştirmek için kullanılmadılar ?


@ChrisLively: Böyle bir değişiklik öneren bir teklif sunacak olsaydım, ilk seferinde neden yapılmadığını bilmediğim kesinlikle bir sorun olurdu ve kesinlikle ilgili ve program çok uygun. özel.
DeadMG

Dizeleri hızlandırmak için ifade şablonlarıyla tam olarak ne yapardınız?
jalf

5
@jalf: Bunu uygulayacak operator+olsaydınız, O(n)tekrarlanan tahsisler için yedek tahsisleri başarabilir ve sıfırlayabilirsiniz, bu da hala değer referanslarından daha hızlı bir şeydir. Buna ek olarak, yalnızca "indeks üzerinde sabit olmayanlara" değil , yazma üzerine kopyalayarak da COW uygulamalarını optimize edebilirsiniz . İfade şablonlarıyla hem performansın hem de anlambilimin geliştirilebileceği başka uygulamalar da vardır.
DeadMG

Bu sorunun bir süre önce sorulduğunu anlıyorum, ancak lütfen ifade şablonlarının ne olduğu ve / veya ilgili materyale bağlantı hakkında bazı ayrıntılar hazırlayın.
einpoklum

Yanıtlar:


17

İfade şablonları ilk olarak Todd Veldhuizen tarafından Haziran 1995'te C ++ Rapor dergisindeki bir makalede yayınlandı. O zamana kadar, standart komite, STL'yi C ++ standardına eklemeyle zaten meşgul oldu, bu da tek başına standardı bir veya iki yıl geciktirdi. (STL, 1993 yılında komiteye sunuldu ve 1994 yılında resmi olarak önerildi. Standardı bitirmek dört yıl daha sürdü.)
C ++ standardizasyon komitesinin bir grup gönüllü olduğu göz önüne alındığında, bazıları kendi şirketlerini ödeyen şirketler tarafından bile desteklenmiyor harcamalar, kimsenin C ++ standardına başka bir fikir eklemek için kullanmak için herhangi bir kaynağı olduğunu sanmıyorum.

1995 yılı Veldhuizen'in makalesinin yayınlandığı yıl. Tekniğin bilinmesi ve tanınması için birkaç yıl daha sürecekti . (STL fikri 70'lere dayanıyor, 80'lerin sonunda bir Ada uygulaması yapıldı, C ++ uygulamasında çalışma 1990 civarında başlamış olmalı ve C ++ standardizasyonuna giden yolu bulması üç yıl daha sürdü komitesi.)
vardı, ancak, standart nihai oylama kadar Todd'un makalesinden sadece üç yıl. Hala yepyeni ve temel olarak test edilmemiş bir fikri birleştirmek için çok az zaman vardı.

Buna ek olarak , bir tür şablon meta-programlama olan İfade Şablonları , stres derleyicilerini nispeten "basit" STL'den çok daha fazla yol katmaktadır. Ve hatırladığım kadarıyla, 1998'de bile standart yayınlandığında, tüm STL'yi bile derleyebilecek bir derleyicimiz yoktu.
Standardizasyon komitesinin ana hedeflerinden birinin yerleşik uygulamaları standartlaştırmak olduğu göz önüne alındığında (buna titizlikle bağlı kalmadıkları değil), İfade Şablonlarının o zamanlar asla gündemde olmaması gerekirdi.


1
Ancak std::stringiostreams STL'de değildi.
R. Martinho Fernandes

@ R.MartinhoFernandes: Ancak bu, komitenin ayıracak kaynakları olduğu anlamına gelmiyor. (Ve std::string edilmiş BTW, bir STL konteyner haline getirmek için değiştirilmiştir.)
sbı

2
Ben sadece bu bağlamak zorunda olduğunu düşünüyorum: std :: string STL bir parçası mı?
Xeo

ah, bu mantıklı.
R. Martinho Fernandes

10

Cevap basittir: Eğer belli ki bunun için kulis etmedi. Ben de ifade şablonlarını içermeyen kendi gündemime sahip olduğumdan (ve yaşadığımdan). Ayrıca, özellikle dizeler için arayüz zaten çok fazla ustaya hizmet etmeye çalışıyor, bu da her şey için kullanılan ve güve için iyi bir sınıfla sonuçlanıyor.

Standart kitaplığın zaten std::valarraybir ifade şablonu uygulama biçimini desteklemesi amaçlanan bir ailesi ve ailesi vardır. Ancak söyleyebildiğim kadarıyla bunu kesmiyor. Buna neden olan bir sorun, yarı pişmiş versiyonunu almak için lobbi yapan kişilerin, dahil olduğu anda içinde çalışmayı bırakmasıdır. Onu kurtarma girişimleri vardı (örneğin, David Vandevoorde, Matt Austern, ve ben Stockholm toplantısında bir gün kadar çalıştım) ama sonunda kimse yeterince ilgilenmedi.


8
Biraz haksızlığa başlıyorsunuz, çünkü DeadMG o zamanlar bezlerini zar zor büyüttüğü ve muhtemelen "C ++" yi düzgün bir şekilde telaffuz edebileceği noktaya ulaşamamış olması nedeniyle lobi yapamadı. :)
sbi

7
Bir yürümeye başlayan çocuk olarak lobicilik alamadım çok üzgünüm: P
DeadMG

1
Herkesin standardı etkileme fırsatı olmadığını fark ettim. Yaklaşık 15 yıldan beri düzenli olarak komite toplantılarına katılmama rağmen, standart üzerindeki etkim sınırlı. Bununla birlikte, benim açımdan: eğer biri standartta bir şey istiyorsa, çaba sarf etmesi gerekir! Orada bulunmayan şeyler, ister teknik ister başka türlü olsun (örneğin tamamen büyümeye konsantre olma) başka öncelikleri olan insanlara bağlıdır.
Dietmar Kühl

Valarray'in libgcc uygulaması ifade şablonlarına dayandırılır.
phresnel

3

Şimdi "ifade şablonları" olarak bilinen teknik, en azından 1994'e kadar hem Todd Veldhuizen hem de kendim tarafından keşfedildi (Todd'un makalesi 1995'ten beri, ancak işlerin yayınlanması biraz zaman alıyor; kendi işim ilk olarak comp.lang.c ++ 'da gösterilmiştir).

Aslında bu sorun nedeniyle C ++ komite toplantılarına katılmaya başladım. Mart 1996'daki ilk Santa Cruz toplantısında, std :: valarray tekniğini ve tamamen yeniden tasarımını komiteye sundum. Çok büyük bir değişiklik olarak kabul edildi, ancak Dietmar'ın ifade ettiği gibi, sonraki toplantıda bazı kelimeler aldık std :: valarrray uygulaması için ifade şablonlarının kullanılmasını sağlayan Stockholm'de. Şaşırtıcı bir şekilde, bu kelimeler hala var: http://wg21.link/N4727 .


1
gerçek URL yerine link kısaltıcı kullanmanın ne anlama geldiğini merak et
gnat

3
@gnat: Bir belge numarası biliyorsanız, bunun için wg21.link URL'sini yazmak önemsizdir. Burada yaptığım şey bu. Bu, bir belgenin yayınlandığı belirli posta / yıla bakmamı sağlıyor. Ayrıca, WG21'in barındırma URL'lerini taşımaya karar vermesi durumunda / wg21.link'in buna göre güncellenmesini ve böylece eski referanslardan kaçınmasını umuyorum. (Yani, nokta
kısalmak

0

En iyi tahminim, hiçbir derleyicinin 1998'de ifade şablonlarını derleyemeyeceğidir.


1
Todd Veldhuizen, ifade şablonunu 1996'dan önce KAI'nin C ++ derleyicisini kullanarak yaptı. Nedeni çok daha küfür ...

1
C ++ topluluğunun büyük bir yüzdesi, 2003 yılına kadar STL'yi tam potansiyeline kullanamıyordu (size bakıyorum, Microsoft!) Ve bu da STL'yi standarda dahil etmek için komiteyi durdurmamıştı.
sbi

2
Aslında, bth Todd ve ben aslında Borland C ++ 4 derleyicisinde (1993'te piyasaya sürüldü) çalışmak için ifade şablonları tekniğini aldık. Bu arada, STL'nin tam olarak çalışması için yapıldığı ilk derleyici olduğuna inanıyorum. Daha sonra başka bir derleyiciye bir ifade şablonları kütüphanesi taşıdım (o sırada Sun'ın Cfront tabanlı derleyicisi dahil!). KAI C ++ derleyici kamera biraz sonra.
Daveed V.15

@DaveedV. BCC4 zamanı için çok iyi bir derleyiciydi ve o zamanın VC versiyonundan çok daha iyi! Kötü şöhretli "gülen böcek" gibi bazı tuhaflıkları vardı. :->Ayrıca, onu yeterince hızlı geliştiremediler, bu yüzden hızla gelişen şablon tekniklerini kullanmakla birlikte gittikçe zorlaştı. VC7.1 piyasaya sürüldüğünde ve çok daha uyumluyken, Borland'ı öldürdü.
sbi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.