David Vandevoorde 著「C++ Template」にあるものと同様の式テンプレートのプロファイルを作成しようとしています。以下は私の理論的分析です。テストが予期しない結果を示しているため、おそらく間違っています。テストが次の内容であるとします。
R = A + B + C;
ここで、A、B、C、R はヒープに割り当てられた配列です。配列のサイズは 2 です。したがって、次のように実行されます。
R[0] = A[0] + B[0] + C[0]; // 3 loads + 2 additions + 1 store
R[1] = A[1] + B[1] + C[1];
約 12 命令 (それぞれ 6 命令) を使用します。
ここで、式テンプレートが有効になっている場合 (一番下に表示)、コンパイラ時に型推定が行われた後、上記と同じ評価が実行される前に、実行時に以下が処理されます。
A + B --> expression 1 // copy references to A & B
expression 1 + C --> expression 2 // copy the copies of references to A & B
// + copy reference to C
したがって、評価前に合計 2+3=5 命令があり、これは合計命令の約 5/(5+12)=30% です。そのため、特にベクトル サイズが小さい場合に、このオーバーヘッドを確認できるはずです。
しかし、結果は、2 つのコストがほぼ同じであることを示しています。テストを 1E+09 回繰り返します。もちろん、2 つのアセンブリ コードは同じです。しかし、この「施工」の部分に手間がかかる部品や説明書が見つかりませんでした。
movsdq (%r9,%rax,8), %xmm0
addsdq (%r8,%rax,8), %xmm0
addsdq (%rdi,%rax,8), %xmm0
movsdq %xmm0, (%rcx,%rax,8)
私はCSのバックグラウンドが良くないので、この質問はとてもばかげているかもしれません. しかし、私はこれについて何日も頭を悩ませてきました。ですから、どんな助けも大歓迎です!
--- 私の表現テンプレート ---
template< typename Left, typename Right >
class V_p_W // stands for V+W
{
public:
typedef typename array_type::value_type value_type;
typedef double S_type;
typedef typename traits< Left >::type V_type;
typedef typename traits< Right >::type W_type;
V_p_W ( const Left& _v, const Right& _w ) : V(_v), W(_w)
{}
inline value_type operator [] ( std::size_t i ) { return V[i] + W[i]; }
inline value_type operator [] ( std::size_t i ) const { return V[i] + W[i]; }
inline std::size_t size () const { return V.size(); }
private:
V_type V;
W_type W;
};
where traits は、オブジェクトの参照の値を取得するかどうかを決定するだけです。たとえば、値は整数に対してコピーされますが、参照は配列に対して取得されます。