2014-01-15 15 views
16

Eigen hat die Klasse Ref <> eingeführt, um Funktionen mit Eigen-Objekten als Parameter zu schreiben, ohne unnötige Provisorien zu verwenden, wenn das Schreiben von Template-Funktionen unerwünscht ist. Man kann darüber lesen here.Korrekte Verwendung der Eigenschaft Eigen :: Ref <>

Bei der weiteren Suche im Internet habe ich mehrere verschiedene Parameterdeklarationen mit der Ref <> Klasse gefunden. In der Eigendokumentation verwenden sie const Eigen::Ref<const Eigen::MatrixXf>& für einen schreibgeschützten Parameter im ersten Beispiel. Im zweiten Beispiel wird Eigen::Ref<Eigen::MatrixXd> für Lese- und Schreibparameter eingeführt, ABER hier wird const Eigen::Ref<const Eigen::MatrixXd> für schreibgeschützte Parameter verwendet (keine Referenz). Also meine Frage ist:

Was ist der Unterschied zwischen den folgenden Erklärungen und wann verwende ich die `

  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>

Der Vollständigkeit halber aufgeführt ich jede mögliche Kombination von const-Nutzung und der Referenz.

+1

Ich würde 'const Eigen :: Ref ' für schreibgeschützte Parameter und 'Eigen :: Ref ' für Lese- und Schreibparameter verwenden. Aber ich bin mir nicht sicher über die Referenz ('&'). –

Antwort

19

Im Allgemeinen ist die Verwendung einer nicht konstanten Referenz wie Ref<T>& nie eine gute Idee, da dies nur funktioniert, wenn der Anrufer bereits ein Ref<T> Objekt zur Hand hat. Dies verwirft 5 und 7.

Die Fälle 3 und 4 macht keinen Sinn, und sie werden nicht im Allgemeinen kompilieren.

Dann gibt es nicht viel Unterschied zwischen einem const Ref<const T> und einem const Ref<const T>&, weil es unwahrscheinlich ist, dass die Funktion mit einem bestehenden Ref<const T> Objekt aufgerufen wird, und so ein Ref<const T> wird ohnehin in den meisten Fällen erstellt werden. Dennoch können wir 1 über 2 oder 6 empfehlen.

Also zusammenfassend können wir Ref<T> für eine beschreibbare Referenz und const Ref<const T>& für eine const-Referenz empfehlen.

Die Option 6, Ref<const T> könnte noch interessant sein, wenn Sie die Matrix ändern möchten, die (nicht ihr Inhalt) durch einen Aufruf Ref Konstruktor referenziert wird placement new verwenden.

+2

könnten Sie näher erläutern, warum Sie 'const Ref &' (mit '&') über 'const Ref ' (kein '&') empfehlen? Es scheint, als hätte das "&" keine Kopie des Ref-Objekts (was ich für billig halte). Im nicht-const-Fall wird das Ref-Objekt trotzdem kopiert, oder? Gibt es dann einen Unterschied in der Leistung beim Übergeben eines 'Ref &' gegenüber einem 'Ref'? – Alejandro

+0

Dies liegt daran, dass, wenn 'T' ein statisch zugewiesener Typ mit fester Größe wie' Matrix4d' ist, Ref ein 'Matrix4d' als Attribut speichern muss, nur für den Fall, dass das übergebene Objekt nicht kompatibel ist. Im Gegensatz zu 'Ref ', das immer billig ist, könnte 'Ref ' schwerer sein. – ggael

Verwandte Themen