2014-01-15 38 views
16

EigenはRef <クラスを導入して、Eigenオブジェクトをパラメータとして関数を書き込んでいますが、テンプレート関数を書くときに不要な一時関数を使用する必要はありません。 1人はこれについて読むことができますhereEigen :: Ref <>クラスの正しい使い方

さらにインターネットを検索すると、Ref <>クラスを使用していくつかの異なる宣言が見つかりました。 Eigenのドキュメントでは、最初の例では読み取り専用パラメータとしてconst Eigen::Ref<const Eigen::MatrixXf>&を使用しています。 2番目の例では、Eigen::Ref<Eigen::MatrixXd>が読み取りと書き込みのパラメータとして導入されていますが、ここではconst Eigen::Ref<const Eigen::MatrixXd>が読み取り専用パラメータ(参照なし)に使用されています。だから私の質問は次のとおりです。

次の宣言とするとき、私はどの `

  1. const Eigen::Ref<const Eigen::MatrixXd>&
  2. const Eigen::Ref<const Eigen::MatrixXd>
  3. const Eigen::Ref<Eigen::MatrixXd>&
  4. const Eigen::Ref<Eigen::MatrixXd>
  5. Eigen::Ref<const Eigen::MatrixXd>&
  6. 使用しないの違いは何ですか?は、
  7. Eigen::Ref<const Eigen::MatrixXd>完全を期すため
  8. Eigen::Ref<Eigen::MatrixXd>&
  9. Eigen::Ref<Eigen::MatrixXd>

IはCONST使用基準の全ての可能な組み合わせが記載されています。

+1

個人的には、読み込み専用のパラメータでは 'const Eigen :: Ref 'を、読み書き可能なパラメータでは 'Eigen :: Ref 'を使用します。しかし、私は参照( '&')についてはわかりません。 –

答えて

19

一般にRef<T>&のような非const参照を使用することは、呼び出し元がすでにRef<T>オブジェクトを手にしている場合にのみ機能するため、決して良い考えではありません。これにより、5と7は破棄されます。

ケース3と4は一般的にはコンパイルされません。関数は、既存のRef<const T>オブジェクトと呼ばれ、そのRef<const T>はとにかくほとんどのケースで作成されなければならないということはほとんどありませんので、

はその後、const Ref<const T>const Ref<const T>&の間に大きな違いはありません。それにもかかわらず、2または6以上の1を推奨できます。

要約すると、参照可能な参照にはRef<T>、書き込み可能な参照にはconst Ref<const T>&を推奨できます。あなたがplacement newを使用してRefコンストラクタへの呼び出しを介して参照されるマトリックス(ないその内容)を変更したい場合は

オプション6、Ref<const T>は、まだ面白いかもしれません。

+2

'const Ref &'( '&')を 'const Ref '( '&'なし)に推奨する理由を詳しく説明できますか? Refオブジェクト(これは安いと思われます)のコピーが含まれていると思われるでしょう。 non-constの場合、Refオブジェクトはとにかくコピーされていますか? 'Ref 'と' Ref'を渡すときのパフォーマンスに違いがありますか? – Alejandro

+0

'T'が' Matrix4d'のような固定サイズの静的に割り当てられた型である場合、Ref は、渡されたオブジェクトが互換性がない場合に備えて属性として 'Matrix4d'を格納しなければならないからです。したがって、常に安価な 'Ref 'とは異なり、 'Ref 'は重いかもしれません。 – ggael

関連する問題