Ini pemahaman saya bahwa templat ekspresi sebagai teknik ditemukan secara signifikan sebelum Standar C ++ asli pada tahun 1998. Mengapa mereka tidak digunakan untuk meningkatkan kinerja beberapa kelas standar suka std::string
dan aliran?
17
operator+
, Anda dapat mencapaiO(n)
dan nol alokasi yang berlebihan untuk alokasi berulang, sesuatu yang masih lebih cepat dari referensi nilai. Selain itu, Anda dapat mengoptimalkan implementasi SAP misalnya dengan menyalin pada tulis , bukan hanya "pada indeks ke non-const". Ada juga aplikasi lain di mana kinerja dan semantik dapat ditingkatkan dengan templat ekspresi.Jawaban:
Template ekspresi pertama kali diterbitkan oleh Todd Veldhuizen pada Juni 1995 , dalam sebuah artikel di majalah C ++ Report . Pada saat itu, komite standar sudah sangat terlibat dengan menambahkan STL ke standar C ++, sebuah tugas yang dengan sendirinya menunda standar satu atau dua tahun. (STL dipresentasikan kepada komite pada tahun 1993, dan secara resmi diusulkan pada tahun 1994. Butuh waktu empat tahun untuk menyelesaikan standar.)
Mengingat bahwa komite standardisasi C ++ adalah sekelompok sukarelawan, beberapa dari mereka bahkan tidak didukung oleh perusahaan yang membayar mereka. pengeluaran, saya tidak berpikir ada yang punya sumber daya untuk digunakan pada menambahkan ide lain ke standar C ++.
Juga, 1995 adalah tahun artikel Veldhuizen diterbitkan. Agar teknik ini diketahui dan diakui , perlu beberapa tahun lagi . (Gagasan STL kembali ke tahun 70-an, implementasi Ada dilakukan pada akhir 80-an, pekerjaan pada implementasi C ++ harus sudah dimulai sekitar tahun 1990, dan butuh tiga tahun lagi untuk ide untuk menemukan jalan menuju standardisasi C ++ komite.)
Namun, hanya ada tiga tahun dari artikel Todd sampai pemungutan suara standar. Itu terlalu sedikit waktu untuk memasukkan ide yang masih baru dan pada dasarnya belum teruji.
Tambahkan ke fakta bahwa Template Ekspresi , menjadi semacam template meta-pemrograman, lebih menekankan kompiler daripada yang relatif "sederhana" STL. Dan dari apa yang saya ingat, bahkan pada tahun 1998, ketika standar diterbitkan, kami tidak memiliki kompiler yang bahkan dapat mengkompilasi semua STL.
Mengingat bahwa salah satu tujuan utama komite standardisasi adalah untuk membakukan praktik yang sudah mapan (bukan karena mereka berpegang teguh pada ini), Template Ekspresi seharusnya tidak pernah menjadi agenda saat itu.
sumber
std::string
dan iostreams tidak di STL.std::string
itu berubah untuk mengubahnya menjadi sebuah wadah STL, BTW.)Jawaban sederhana adalah: Anda jelas tidak melobi untuk itu. Saya juga tidak karena saya punya (dan memiliki) agenda saya sendiri yang tidak termasuk template ekspresi. Juga, antarmuka khususnya untuk string sudah mencoba melayani terlalu banyak master, menghasilkan kelas yang digunakan untuk semuanya dan bagus untuk mothing.
Pustaka standar sudah
std::valarray
dan keluarga yang dimaksudkan untuk mendukung gaya implementasi templat ekspresi. Sejauh yang saya tahu itu tidak cukup memotongnya. Salah satu masalah yang menyebabkan ini adalah bahwa orang-orang yang melobi untuk mendapatkan versi setengahnya dimasukkan ke dalam standar berhenti bekerja di dalamnya saat itu dimasukkan. Ada upaya untuk menyelamatkannya (mis. David Vandevoorde, Matt Austern, dan saya mengerjakannya selama sekitar satu hari di pertemuan Stockholm) tetapi pada akhirnya tidak ada yang cukup tertarik.sumber
:)
Teknik yang sekarang dikenal sebagai "templat ekspresi" ditemukan (secara independen) setidaknya sejauh tahun 1994 oleh Todd Veldhuizen dan saya sendiri (artikel Todd berasal dari 1995, tetapi butuh sedikit waktu untuk menerbitkannya; karya saya sendiri pertama kali ditampilkan di comp.lang.c ++).
Saya benar-benar mulai menghadiri pertemuan komite C ++ karena masalah ini. Saya mempresentasikan teknik dan desain ulang yang lengkap dari std :: valarray kepada komite pada pertemuan Santa Cruz pertama pada bulan Maret 1996. Itu dianggap sebagai perubahan yang terlalu besar, tetapi seperti yang disinggung oleh Dietmar, kami mendapat beberapa kata di pertemuan berikutnya di Stockholm yang memungkinkan penggunaan templat ekspresi untuk implementasi std :: valarrray. Yang mengejutkan saya, kata-kata itu masih ada: Lihat paragraf 3-6 ayat [valarray.syn] 29.7.1 di http://wg21.link/N4727 .
sumber
Tebakan terbaik saya adalah bahwa tidak ada kompiler yang dapat mengkompilasi template ekspresi kembali pada tahun 1998.
sumber
:->
Plus mereka gagal memperbaikinya dengan cukup cepat, sehingga dengan cepat menjadi semakin sulit untuk menggunakan teknik templat yang meningkat cepat dengannya. Ketika VC7.1 dirilis dan jauh lebih patuh, itu membunuh Borland.