問題タブ [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++ - プロファイリング式テンプレート
David Vandevoorde 著「C++ Template」にあるものと同様の式テンプレートのプロファイルを作成しようとしています。以下は私の理論的分析です。テストが予期しない結果を示しているため、おそらく間違っています。テストが次の内容であるとします。
ここで、A、B、C、R はヒープに割り当てられた配列です。配列のサイズは 2 です。したがって、次のように実行されます。
約 12 命令 (それぞれ 6 命令) を使用します。
ここで、式テンプレートが有効になっている場合 (一番下に表示)、コンパイラ時に型推定が行われた後、上記と同じ評価が実行される前に、実行時に以下が処理されます。
したがって、評価前に合計 2+3=5 命令があり、これは合計命令の約 5/(5+12)=30% です。そのため、特にベクトル サイズが小さい場合に、このオーバーヘッドを確認できるはずです。
しかし、結果は、2 つのコストがほぼ同じであることを示しています。テストを 1E+09 回繰り返します。もちろん、2 つのアセンブリ コードは同じです。しかし、この「施工」の部分に手間がかかる部品や説明書が見つかりませんでした。
私はCSのバックグラウンドが良くないので、この質問はとてもばかげているかもしれません. しかし、私はこれについて何日も頭を悩ませてきました。ですから、どんな助けも大歓迎です!
--- 私の表現テンプレート ---
where traits は、オブジェクトの参照の値を取得するかどうかを決定するだけです。たとえば、値は整数に対してコピーされますが、参照は配列に対して取得されます。
c++ - auto キーワードで作成された型を使用した式テンプレートでのセグメンテーション違反
計算カーネルの式テンプレートを使用してコードを作成しています。私の質問は非常に短いです: なぜ GNU G++ は+=
、次の例のを含む行で segfault (4.9.1、-O3 でコンパイル) を与えるのですか?
しかし、同等のコードを入力したときではありません。
Clang と Intel の両方が正常に動作します。
以下のコード全体を追加しました。長々と申し訳ありませんが、これは私が作成できる最短の例でした:
c++ - 式テンプレート: エラー C2784「テンプレート引数を推定できませんでした」
式テンプレートを使用するベクター クラスに取り組んでいます。次の(縮小された)コードがあります。"Vector.h" で:
次に、「main.cpp」で:
normalize
ここで、 classのメンバーをコメント アウトするExpression
と、コードがコンパイルされ、 と のどのバージョンが呼び出されるかなど、すべてが期待どおりに機能しlength
ますnormalize
。ただし、メンバーをnormalize
コメント解除したままにすると、次のコンパイラ エラーが発生します。
正常にコンパイルして動作する で行われる方法と同様に、 で動作するスタンドアロン関数として、Vector
またはExpression
の継承されたメンバーとしてnormalize を呼び出すことができるようにしたいと考えています。のスタンドアロン バージョンも正しく動作します。クラスメンバーとしての私の定義の何が問題になっていますか?Expression
length
normalize
normalize
ありがとう!
c++ - 式テンプレートの周囲にサードパーティ ライブラリ ラッパー クラスを作成する方法
大規模な数値シミュレーション (有限要素法、有限差分法、トポロジー最適化など) を実行するために、私の研究グループで新しい C++ コードを実装しようとしています。このソフトウェアは、学界と産業界の両方の人々によって使用されます。
ソフトウェアの密な線形代数部分については、Eigen または Armadillo のいずれかを使用したいと考えています。これらのパッケージのラッパーを作成する理由は 2 つあります。1. サードパーティの API ではなく、独自の API をユーザーに公開するため。2. 将来ライブラリを切り替える必要がある場合。理由 2 は非常に高額な保険であることは承知していますが、以前のシミュレーション ソフトウェアでこのような状況に遭遇しました。
サードパーティ ライブラリのラッピングに関して私が遭遇した情報は、次の情報源からのものです。
私の質問は、このラッパー クラスを構築する最良の方法に関するものです。理想的には、次のように薄層ラッパーが最適です。
または固有ベクトルと同等のもの。
次に、私のクラスはサードパーティのライブラリ クラスを次のように呼び出します。
この薄いレイヤーの問題は、これらのライブラリが内部で実装した式テンプレートから得られる速度が失われることだと思います (これについて確認したいと思います)。たとえば、Armadillo では、次の操作を行います。
次のようになります。
式テンプレートが実装されているため、一時変数を作成する必要はありません。同じ状況がアイゲンにも当てはまります。
私の知る限り、式テンプレートの力を失った理由は、Armadillo や Eigen が独自の一時変数を作成しないのに対し、私のクラス my_vec は作成するためです。これを回避する唯一の方法は、式テンプレートの周りにも薄いレイヤー ラッパーを構築することです。ただし、現時点では、これは YAGNI 原則に違反しているようです。
この関連する質問は次のとおりです。
次のようなものを使用することをお勧めします。
代わりにこのようなものを使用することは可能ですか?
または、演算子のオーバーロードを使用して data() をユーザーから隠しますか? ライブラリを直接使用したくない場合、他にどのような選択肢がありますか? マクロを使用していますか?C++11 を使用する場合、エイリアスを使用しますか?
または、このラッパー クラスを構築する最も便利な方法は何でしょうか?
c++ - 変数を宣言しながら式を評価する方法 (式テンプレート内)
C++ で式テンプレートを調べようとしています。基本的に3つのコンポーネントを持つ座標、空間ベクトル、力などを格納するための3Dベクトル(基本的にサイズ3のベクトル)のクラスを作成しようとしています。
これまでのところ、2 つのベクトルの合計を実行するクラスのみを実装しました。私が書いた場合、コードは正常に動作しますvector3d z; z = x + y;
。つまり、最初に z 変数を宣言してから加算を実行するとします。vector3d z = x + y;
しかし、一文で書こうとするとエラーになります。私は得るerror: conversion from 'const ExprSum<vector3d, vector3d>' to non-scalar type 'vector3d' requested vector3d z_new = x + y ;
=
変数宣言時に使用できるようにするには、どのように実装すればよいですか?
以下は私の完全なコードです: