式テンプレート手法により、次のような行列式
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 の提案に従って、関連するリンクを要約する