問題タブ [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.

0 投票する
0 に答える
141 参照

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

提案してください。

0 投票する
2 に答える
319 参照

c++ - 最新のコンパイラが式テンプレートの必要性を取り除かなかったのはなぜですか?

C++ の式テンプレートの標準的なピッチは、不要な一時オブジェクトを削除することで効率を高めるというものです。C++ コンパイラがこれらの不要な一時オブジェクトを削除できないのはなぜですか?


これは私がすでに答えを知っていると思う質問ですが、オンラインで低レベルの答えを見つけることができなかったので確認したいと思います.

式テンプレートは基本的に極端なインライン化を許可/強制します。ただし、インライン化を行っても、コンパイラはoperator newandへの呼び出しを最適化できませんoperator delete。これらの呼び出しは、他の翻訳単位でオーバーライドできるため、これらの呼び出しを不透明なものとして扱うためです。式テンプレートは、中間オブジェクトの呼び出しを完全に削除します。

operator newandへのこれらの不要な呼び出しはoperator delete、コピーするだけの簡単な例で見ることができます。

生成されたコードでは、が を 2 回呼び出し、 whileを 1foo()回呼び出して比較的長い関数にコンパイルされ、レジスタの転送のみにコンパイルされ、不要なコピーが行われないことがわかります。operator newoperator deletebar()

この分析は正しいですか?

C++ コンパイラは合法的にコピーを省略できますfoo()か?