5

式テンプレート手法により、次のような行列式

D = A*B+sin(C)+3.;

計算パフォーマンスの点では、手書きのforループとほとんど同じです。

さて、次の2つの式があるとします

D = A*B+sin(C)+3.;
F = D*E;
cout << F << "\n";

for式テンプレートによる「古典的な」実装では、計算パフォーマンスは、2 つのループを順番に実行した場合とほぼ同じになります。=これは、演算子が検出された直後に式が評価されるためです。

私の質問は: の値が実際には使用されておらず、D対象の値が の唯一の要素であることを認識するための手法 (たとえば、プレースホルダーの使用) はありますか?F

F = E*(A*B+sin(C)+3.);

forが評価され、全体のパフォーマンスは 1 つのループのパフォーマンスと同等ですか?

もちろん、そのような仮説的な手法は、式を評価するために戻ることもできるはずです。

D = A*B+sin(C)+3.;

コードの後半で の値Dが必要な場合。

よろしくお願いします。

編集: Evgeny によって提案されたソリューションを実験した結果

元の指示:

Result D=A*B-sin(C)+3.;

計算時間: 32ms

2 つのステップ命令:

Result Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;

計算時間: 43ms

ソリューションauto:

auto&& Intermediate=A*B;
Result D=Intermediate-sin(C)+3.;

計算時間: 32ms。

結論としてauto&&、単一命令ケースの元の計算時間を復元することができました。

編集: Evgeny の提案に従って、関連するリンクを要約する

コピーエリシオン

自動車が教えてくれること

C++11 のユニバーサル参照

C++ 右辺値参照の説明

C++ and Beyond 2012: Scott Meyers - C++11 のユニバーサル リファレンス

4

2 に答える 2