2017-12-02 12 views
-1

私は式テンプレートとmshadowコードベースを研究しています。彼らのwikiページhereには、時間的なメモリ割り当てと割り当て解除を行うため、悪い解決策である例があります。それは何ですか?そして、与えられたコードはどうやってこのようなことをしていますか?一時的なメモリ割り当てとは何ですか?

呼ばコード:彼らは一時的に値を保持するメモリ内のいくつかのスペースを割り当てる話している。この場合

// Naive solution for vector operation overloading 
struct Vec { 
    int len; 
    float* dptr; 
    Vec(int len) : len(len) { 
    dptr = new float[len]; 
    } 
    Vec(const Vec& src) : len(src.len) { 
    dptr = new float[len]; 
    memcpy(dptr, src.dptr, sizeof(float)*len); 
    } 
    ~Vec(void) { 
    delete [] dptr; 
    } 
}; 

inline Vec operator+(const Vec &lhs, const Vec &rhs) { 
    Vec res(lhs.len); 
    for (int i = 0; i < lhs.len; ++i) { 
    res.dptr[i] = lhs.dptr[i] + rhs.dptr[i]; 
    } 
    return res; 
} 
+0

コードにリンクしないでください。関連するすべてのコードは質問に*含める必要があります。 –

+0

あなたの質問を探すために私たちを砂にしないでください。ここにコードを追加することができます。 – Green

+0

質問を編集しました。 –

答えて

1

。例えば

あなたは

a = a + b; 

を行う際に、コンパイラが行います、次の

  1. 新しいメモリブロックを割り当てabの合計を計算し、そのに結果を書きますブロック
  2. 一時記憶領域の結果をaにコピーします。

#1または#3を行う理由はありませんでした。実際には合計値がaに直接入る可能性があるためです。

コンパイラがa=a+ba+=bが同じものであることを理解できないのはなぜですか?答えはintの場合doublesize_tこれは常に真ですが、これらの2つの演算子が異なる何かを実行するクラスを実装できるためです。 std::ofstreamが完全に異なる何かに対して左ビットシフト演算子を使用する方法を見てみましょう。