2

その中にいくつかのboost::numeric::ublas::matrixを含むクラスがあります。クラスの演算子 (+-*/=) をオーバーロードして、1 つのステートメントで一連の行列を処理できるようにしたいと考えています。

ただし、これには、元のクラスを変更せずに値を持ち運ぶために、クラスの一時的なインスタンスが必要なようです。これは私には理にかなっていますが、関数内で新しいインスタンスを作成して返すと、次のようになります。

警告: ローカル変数 'temp' への参照が返されました

私はc ++にかなり慣れていないので、演算子のオーバーロードの例はすべて新しい一時オブジェクトを返すようです。また、新しいマトリックスをインスタンス化する際のオーバーヘッドを回避したいと思います。これにより、すべての要素をループすることになります。これについてどうすればよいですか?パフォーマンスは懸念事項です。

4

2 に答える 2

3

すでにブーストを使用している場合は、例とともにboost::operatorsを使用することを強くお勧めします。

いくつかの利点があります。

  1. +=/-=/ = 演算子をオーバーロードし、+/-/演算子を無料で取得するだけで済みます。
  2. 自由に実装された演算子の最適な実装が得られます。
  3. 設計が少なくて済む = バージョンを実装するため、投稿した問題を取り除くことができます。
于 2010-01-02T00:09:29.220 に答える
1

演算子のオーバーロードの従来の方法は次のとおりです。(おもう)

インプレース演算子は、次のようなメンバーとして定義されます。

foo& operator+=(const foo& rhs);
foo& operator*=(const foo& rhs);
// etc.

これは単に彼らが必要なことをするだけです*this

foo& operator+=(const foo& rhs)
{
    // add elements together

    return *this;
}

次に、無料の関数を作成し、引数でコピーを実行します。

const foo operator+(foo lhs, const foo& rhs)
{
    return lhs += rhs;
}

戻り値はconst、次のことを行うのがおかしいためです。

foo a, b, c;
(a + b) = c;

同じように、次のことを行うのは奇妙です。

int a, b, c;
(a + b) = c;

あなたはそれについて異なる意見を得るでしょうが。これは、コードを再利用し、コピーを自動的に実行する方法です。非常に簡潔で読みやすい。

ただし、ニールと私が上で述べたように、新しいデータを作成する場合、ある時点で、そのデータは新しい場所にとどまる必要があります。これを回避できる場合は、ミューティング演算子を使用しますが、一部のことは単純に回避できません。

それも問題ではないかもしれません。そうである場合は、メモリ割り当てを最適化してみてください。これらはおそらく最も遅い部分です。よくわかりませんが、ほとんどのブーストクラスではアロケータを指定できると思います。ここでは、ブーストメモリプールライブラリが役立つ場合があります。

于 2010-01-01T08:59:37.530 に答える