C ++標準が式テンプレートを採用しなかったのはなぜですか?


17

テクニックとしての式テンプレートは、1998年の元のC ++標準よりもかなり前に発見されたと理解しています。なぜstd::string、ストリームのようないくつかの標準クラスのパフォーマンスを改善するために使用されなかったのですか?


@ChrisLively:そのような変更を提案する提案を提出する場合、それが絶対に最初に行われなかった理由がわからなかったのは絶対に問題であり、それは絶対にプログラミング関連であり、答えは非常に明確な。
DeadMG

文字列を高速化するために、式テンプレートで正確に何をしますか?
jalf

5
@jalf:これをに適用するとoperator+O(n)繰り返し割り当てに対して冗長割り当てを達成し、ゼロにすることができます。これは、右辺値参照よりも高速です。さらに、「非定数へのインデックス上」だけでなく、書き込み時にコピーすることにより、たとえばCOW実装を最適化できます。式テンプレートを使用してパフォーマンスとセマンティクスの両方を改善できる他のアプリケーションもあります。
DeadMG

この質問は少し前に聞かれたことに気づきましたが、表現テンプレートとは何かや関連する資料へのリンクについて詳しく説明してください。
アインポクルム

回答:


17

式テンプレートは、1995年 6月にC ++ Reportマガジンの記事でTodd Veldhuizenによって最初に公開されました。その時までに、標準委員会はC ++標準へのSTLの追加にすでに大きく関与していました。これは、それ自体で標準を1〜2年遅らせました。(STLは1993年に委員会に提出され、1994年に正式に提案されました。標準を完成させるのにさらに4年かかりました。)
C ++標準化委員会は多くのボランティアであり、費用がかかりますが、C ++標準にさらに別のアイデアを追加する際に使用できるリソースは誰も持っていないと思います。

また、1995年はVeldhuizenの記事が出版されたちょうど年です。技術が知られて認識されるにはさらに数年かかったでしょう。(STLのアイデアは70年代にまでさかのぼり、Adaの実装は80年代後半に行われました。C++実装での作業は1990年頃に開始されたに違いありません。委員会。)
がありました、しかし、標準の最終投票までトッドの記事からわずか3年。まだ新しく、基本的にテストされていないアイデアを取り入れるには時間がかかりすぎていました。

それに加えて、Expression Templatesは一種のテンプレートメタプログラミングであり、比較的「単純な」STLよりもコンパイラーストレスを与えるという事実に加えて。私が覚えていることから、標準が公開された1998年でさえ、すべてのSTLをコンパイルできるコンパイラーがありませんでした。
標準化委員会の主な目標の1つが、確立された実践を標準化することであったことを考えると(厳密にこれに固執するのではなく)、Expression Templatesが当時の議題になったことはなかったはずです。


1
しかしstd::string、iostreamはSTLに含まれていませんでした。
R.マルティーニョフェルナンデス

@ R.MartinhoFernandes:ただし、委員会に余裕があるわけではありません。(そして、それをSTLコンテナー、BTWに変えるようstd::string 変更されました。)
sbi

2
これをリンクする必要があると思います:std :: stringはSTLの一部ですか?
Xeo

@sbiああ、それは理にかなっています。
R.マルティーニョフェルナンデス

10

簡単な答えは次のとおりですあなたは明らかにロビー活動をしていません。また、式テンプレートを含まない独自のアジェンダを持っている(持っている)ので、私もしませんでした。また、特に文字列用のインターフェイスは、すでに非常に多くのマスターにサービスを提供しようとしているため、すべてに使用され、モージングに適したクラスになります。

標準ライブラリには、すでにstd::valarray式テンプレートスタイルの実装をサポートすることを目的としたファミリがあります。私が知る限り、それはそれを完全にカットしていません。これを引き起こした問題の1つは、その中途半端なバージョンを標準に含めるためにロビー活動を行った人々が、標準に含まれる瞬間に機能を停止したことです。救助の試みがありましたが(例えば、デビッド・ヴァンデブールデ、マット・オースターン、そして私はストックホルム会議で1日かそこらで作業しました)、最終的には誰も十分な興味を持ちませんでした。


8
DeadMGは、おむつをかろうじて成長し、「C ++」を適切に発音することができなかったという単純な事実のために、DeadMGがロビー活動をすることができなかったため、少し不公平なところから始めます。:)
-sbi

7
幼児の頃、ロビー活動ができなかったことをひどく申し訳ありません
。P– DeadMG

1
誰もが規格に影響を与える機会を持っていなかったことを理解しています。約15年以来、定期的に委員会に出席していますが、標準に対する私の影響は限定的です。しかし、私のポイントは、誰かが標準で何かを望んでいるなら、努力する必要があるということです!そこにいないことは、技術的であろうとなかろうと(他の優先順位を持っている人に本質的に依存します(例えば、成長に完全に集中する))。
ディートマークー

式テンプレートに基づいたvalarrayのlibgcc実装。
フレネル14年

3

現在「式テンプレート」として知られている手法は、少なくとも1994年までトッド・ヴェルデューゼンと私自身によって発見されました(トッドの記事は1995年からですが、出版には少し時間がかかります;私自身の仕事comp.lang.c ++で最初に表示されました)。

この問題のために、私は実際にC ++委員会の会議に出席し始めました。1996年3月の最初のサンタクルーズ会議で、この手法とstd :: valarrayの完全な再設計を委員会に提示しました。変更は大きすぎると思われましたが、Dietmarがほのめかしているように、その後の会議でストックホルムでは、std :: valarrrayの実装に式テンプレートを使用できます。驚いたことに、これらの単語はまだそこにあります。http: //wg21.link/N4727のサブセクション[valarray.syn] 29.7.1の段落3-6を参照してください


1
不思議の代わりに実際のURLのリンク短縮サービスを使用してのポイントは何だ
ブヨ

3
@gnat:文書番号がわかっている場合、wg21.linkのURLを書くのは簡単です。それが私がここでやったことです。また、ドキュメントがリリースされた特定のメール/年を調べるのを節約できます。また、WG21がホスティングURLを移動することを決定した場合、wg21.linkがそれに応じて更新され、古い参照が回避されることを期待しています。(つまり、ポイントは短縮ではなく、読みやすさです。)
デイブドV.18年

0

私の最良の推測は、1998年にコンパイラが式テンプレートをコンパイルできなかったということです。


1
Todd Veldhuizenは、1996年より前にKAIのC ++コンパイラを使用して式テンプレートを作成していました。その理由は、はるかに不敬...である

1
C ++コミュニティの大部分は、2003年までSTLを最大限に活用することができませんでした(私はあなたを探しています、Microsoft!)。それは、STLを標準に組み込む委員会を停止しませんでした。
sbi

2
実際、bth Toddと私はもともと、Borland C ++ 4コンパイラ(1993年にリリースされた)で動作する式テンプレート技術を取得しました。ちなみに、STLが完全に動作するようになった最初のコンパイラでもあると思います。後で式テンプレートライブラリをさまざまな他のコンパイラ(当時のSunのCfrontベースのコンパイラを含む!)に移植しました。KAI C ++コンパイラーは少し後でカムします。
デイブドV.18年

@DaveedV。BCC4は当時としては非常に優れたコンパイラであり、当時のVCバージョンよりもはるかに優れていました。ただし、悪名高い「スマイリーバグ」のように、いくつかの癖がありました。:->さらに、彼らはそれを十分に速く改善することができなかったので、急速に改善するテンプレート技術を使用することはすぐに難しくなりました。VC7.1がリリースされ、はるかに順守されたとき、ボーランドは殺されました。
sbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.