問題タブ [expression-templates]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::future を使用して式の評価を遅らせる
Expr
次のような式を作成するために使用できる、式テンプレート方法論を使用するというクラスがあります。
operator>>(T& val)
式はが呼び出されたとき、つまりが検出されたときに評価され>>
ます。関数が式を評価し、クラスで定義されている 内で呼び出さeval
れるとします。operator>>(T& val)
Expr
ここで、先物を導入することで、ユーザーが結果を必要とするまで評価をさらに遅らせたいと考えています。したがって、次のように変更operator>>
します。
std::future<void> handle_
問題は、後で簡単にアクセスできるように、どのように/どこで宣言するかです。現在、それはグローバルに宣言されていますが、私はそれが好きではありません。Expr
理想的には、私はこれを行うことができるように、クラスのメンバーとして将来を持ちたいと考えています:
ここでv.get()
は、内部的に を呼び出しますhandle_.get()
。ただし、これは正しくありません。呼び出したオブジェクトがどこにも格納されておらず、の別のインスタンスoperator>>
を呼び出そうとしているため、エラーが発生します。get()
Expr
提案してください。
c++ - 最新のコンパイラが式テンプレートの必要性を取り除かなかったのはなぜですか?
C++ の式テンプレートの標準的なピッチは、不要な一時オブジェクトを削除することで効率を高めるというものです。C++ コンパイラがこれらの不要な一時オブジェクトを削除できないのはなぜですか?
これは私がすでに答えを知っていると思う質問ですが、オンラインで低レベルの答えを見つけることができなかったので確認したいと思います.
式テンプレートは基本的に極端なインライン化を許可/強制します。ただし、インライン化を行っても、コンパイラはoperator new
andへの呼び出しを最適化できませんoperator delete
。これらの呼び出しは、他の翻訳単位でオーバーライドできるため、これらの呼び出しを不透明なものとして扱うためです。式テンプレートは、中間オブジェクトの呼び出しを完全に削除します。
operator new
andへのこれらの不要な呼び出しはoperator delete
、コピーするだけの簡単な例で見ることができます。
生成されたコードでは、が を 2 回呼び出し、 whileを 1foo()
回呼び出して比較的長い関数にコンパイルされ、レジスタの転送のみにコンパイルされ、不要なコピーが行われないことがわかります。operator new
operator delete
bar()
この分析は正しいですか?
C++ コンパイラは合法的にコピーを省略できますfoo()
か?