Mengapa Standar C ++ tidak mengadopsi templat ekspresi?

17

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::stringdan aliran?

DeadMG
sumber
@ ChrisLively: Jika saya mengajukan proposal yang menyarankan perubahan seperti itu, maka itu benar-benar akan menjadi masalah yang saya tidak tahu mengapa itu tidak dilakukan pertama kali, dan itu benar-benar pemrograman yang relevan dan jawabannya sangat spesifik.
DeadMG
Apa tepatnya yang akan Anda lakukan dengan templat ekspresi untuk mempercepat string?
Jalf
5
@jalf: Jika Anda menerapkannya operator+, Anda dapat mencapai O(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.
DeadMG
Saya menyadari pertanyaan ini ditanyakan beberapa waktu lalu, tetapi tolong uraikan beberapa tentang apa itu template ekspresi dan / atau tautan ke materi yang relevan.
einpoklum

Jawaban:

17

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.

sbi
sumber
1
Tapi std::stringdan iostreams tidak di STL.
R. Martinho Fernandes
@ R.MartinhoFernandes: Itu tidak berarti, bagaimanapun, komite punya sumber daya cadangan (Dan std::string itu berubah untuk mengubahnya menjadi sebuah wadah STL, BTW.)
sbi
2
Saya rasa saya hanya perlu menautkan ini: Apakah std :: string bagian dari STL?
Xeo
@ Ah, itu masuk akal.
R. Martinho Fernandes
10

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::valarraydan 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.

Dietmar Kühl
sumber
8
Anda memulai sedikit tidak adil, karena DeadMG tidak bisa melobi karena fakta sederhana bahwa ia hampir tidak tumbuh popok saat itu dan mungkin belum mencapai titik di mana ia bisa mengucapkan "C ++" dengan benar. :)
sbi
7
Sangat menyesal bahwa sebagai balita, saya tidak bisa melobi: P
DeadMG
1
Saya menyadari bahwa tidak semua orang memiliki kesempatan untuk mempengaruhi standar. Meskipun saya secara teratur menghadiri pertemuan komite sejak sekitar 15 tahun pengaruh saya pada standar terbatas. Namun, maksud saya adalah: jika seseorang menginginkan sesuatu dalam standar mereka perlu berusaha! Hal-hal yang tidak ada pada dasarnya adalah pada orang-orang yang memiliki prioritas lain, apakah mereka teknis atau sebaliknya (misalnya berkonsentrasi penuh pada tumbuh dewasa).
Dietmar Kühl
Implementasi libgcc dari basis valarray pada templat ekspresi.
phresnel
3

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 .

Daveed V.
sumber
1
bertanya-tanya apa gunanya menggunakan pemendek tautan alih-alih URL sebenarnya
agas
3
@gnat: Jika Anda mengetahui nomor dokumen, sepele untuk menulis URL wg21.link untuknya. Itu yang saya lakukan di sini. Ini menyelamatkan saya mencari mailing / tahun tertentu dimana sebuah dokumen dirilis. Juga, saya berharap jika / ketika WG21 memutuskan untuk memindahkan URL hosting, wg21.link akan diperbarui, sehingga menghindari referensi basi. (Yaitu, intinya bukan pemendekan, tetapi keterbacaan.)
Daveed V.
0

Tebakan terbaik saya adalah bahwa tidak ada kompiler yang dapat mengkompilasi template ekspresi kembali pada tahun 1998.

fredoverflow
sumber
1
Todd Veldhuizen melakukan pekerjaan template ekspresinya sebelum tahun 1996 menggunakan kompiler C ++ KAI. Alasannya jauh lebih profan ...
1
Sebagian besar komunitas C ++ tidak dapat menggunakan STL secara maksimal hingga tahun 2003 (Saya melihat Anda, Microsoft!), Dan itu tidak menghentikan komite untuk memasukkan STL ke dalam standar.
sbi
2
Sebenarnya, Todd dan saya awalnya mendapatkan teknik templat ekspresi untuk bekerja pada kompiler Borland C ++ 4 (yang dirilis pada tahun 1993). Kebetulan, saya percaya itu juga kompiler pertama di mana STL dibuat untuk berfungsi penuh. Saya kemudian porting perpustakaan templat ekspresi ke berbagai kompiler lain (termasuk kompiler berbasis Sun's Cfront pada saat itu!). Cam kompiler KAI C ++ sedikit kemudian.
Daveed V.
@DaveedV. BCC4 adalah kompiler yang sangat bagus untuk masanya dan jauh lebih baik daripada versi VC waktu itu! Memang ada beberapa kebiasaan, seperti, "bug smiley" yang terkenal. :->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.
sbi