2016-12-11 12 views
2

Es sieht aus wie Verwendung von Eigenen Typen mit STL-Containern ist sehr chaotisch und erfordert besondere Aufmerksamkeit auf Ausrichtungsprobleme. Mein Problem ist, dass ich plane, eine komplexe Klassenhierarchie mit Dutzenden von Klassen zu erstellen, die einen oder mehrere Eigen-Typen als Mitgliedsvariablen enthalten können. Aus der Dokumentation geht hervor, dass Ihre Klasse, sobald Sie die Eigenschaftsvariablen Eigen eingeben, mit den gleichen Problemen "infiziert" wird wie die Eigenarten. Das bedeutet, dass ich besonders darauf achten muss, STL-Container nicht nur für Eigen-Typen, sondern auch für all meine Dutzende von Klassen zu verwenden.Verwenden von Eigenen Typen mit STL-Containern und Std :: vector

Noch schlimmerer Teil, der mich beunruhigt, ist, dass jeder, der Instanzen meiner Klassen in ihrem Code verwendet, dieselben Probleme haben und benötigt werden, um Experte zu diesem Thema zu sein - selbst wenn meine Klassen keinen Eigenen Typen in enthüllten ihre öffentliche Schnittstelle!

Das ist ziemlich frustrierend. Fragen, die ich habe,

  1. Ist mein Verständnis oben korrekt (ich muss nur C++ 11 und moderne Compiler unterstützen)?
  2. Gibt es ein Muster, das Leute benutzen, damit sie ihren Code nicht mit speziellen Eigenen umgehen müssen, die überall herumlaufen?
  3. Ich denke darüber nach, die gesamte Vektorisierung global zu deaktivieren. Würde das obige Problem auf Kosten der Leistung lösen? Kann es selektiv nur für bestimmten Code aktiviert werden?
  4. Wenn ich vergesse, irgendwo im Code auf das Alignment-Problem zu achten, bekomme ich immer Kompilierzeit Fehler ODER Problem kann versteckt bleiben und es kann zur Laufzeit zum Absturz kommen?

Antwort

4

Ja Ihr Verständnis ist meistens richtig, aber ich möchte hinzufügen, dass dies nur Bedenken Eigens feste Größe Typen, die Ausrichtung wie Vector4f erfordern, Matrix2d usw. aber nicht Vector3f oder MatrixXd. Außerdem besteht der Kern des Problems darin, dass STL-Container die Anforderungen alignas noch nicht erfüllen, obwohl dies in einer zukünftigen C++ - Version kommen sollte.

Ich denke, dass der einfachste Weg, um solche Schwierigkeiten zu vermeiden, ist nicht ausgerichtet Typen für die Teilnehmer und Containerwerttypen wie die Eigen verwenden:

typedef Eigen::Matrix<float,4,1,Eigen::DontAlign> UVector4f; 
typedef Eigen::Matrix<double,2,2,Eigen::DontAlign> UMatrix2d; 

diese Weise können Sie über die Ausrichtung stören nicht haben Probleme, und Sie werden keine explizite Vektorisierung verlieren. In Eigen 3.3 werden auch nicht ausgerichtete Objekte vektorisiert.

EDIT:

In Bezug auf Ihre letzte Frage, leider gibt es keine Möglichkeit, in C++ ein solches Manko bei der Kompilierung zu erkennen. Wenn Assertions nicht deaktiviert sind und eine ungültige nicht ausgerichtete Zuweisung zur Laufzeit auftritt, erhalten Sie eine explizite Assertions-Nachricht, aber das ist alles, was wir tun können. Wenn Ihr Programm auf einem bestimmten System mit einigen Kompilierungsflags einwandfrei läuft, bedeutet dies nicht, dass Ihr Code sicher ist. Zum Beispiel wird bei den meisten 64-Bit-Systemen der Puffer an der 16-Byte-Grenze ausgerichtet. Wenn Sie also den AVX-Befehlssatz nicht aktivieren, wird Ihr Code ordnungsgemäß ausgeführt. Auf der anderen Seite kann derselbe Code aktiviert werden, wenn Sie zu einer exotischeren Plattform wechseln oder AVX-Befehle aktivieren, die standardmäßig eine 32-Byte-Ausrichtung erfordern. Nichtsdestotrotz werden statische Analysatoren immer leistungsfähiger und ich denke, dass einige dieser Probleme von ihnen entdeckt werden könnten.

Eine andere Strategie besteht darin, Ihr Programm mit einem benutzerdefinierten malloc zu überprüfen, der nur 8 Bytes ausgerichtete Puffer zurückgibt.Auf diese Weise sollten Sie in der Lage sein, alle Unzulänglichkeiten zu erkennen, vorausgesetzt, Ihr Programm wird durch Komponententests gut abgedeckt. Um dies zu tun, müssen Sie aus offensichtlichen Gründen mit -DEIGEN_MALLOC_ALREADY_ALIGNED=0 kompilieren.

+1

Schnelle Frage: Wenn ich vergesse, um Ausrichtung Problem irgendwo im Code zu kümmern, bekomme ich immer Kompilierzeit Fehler ODER Problem kann versteckt bleiben und es kann zur Laufzeit zum Absturz kommen? – ShitalShah

+0

BTW, Ich habe meine Antwort bearbeitet, um Ihre letzte Frage zu beantworten. – ggael

Verwandte Themen