Seite 1 von 1
#define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:00
von joggel
Hallo,
ich wollte diese Mathe-Bibliothek verwenden:
http://eigen.tuxfamily.org/index.php?title=Main_Page
Nun hat diese Bibliothek mir über die Ausgabe zu verstehen gegeben, dass ich, wenn ich unter windows kompiliere,
#define NOMINMAX schreiben muss. Also die Makros für "min" und "max" ausschalten soll.
Ich habe
#define NOMINMAX in vor jeder Einbindung von "windows.h" geschrieben.
Nun verwende ich aber std::vector<MyClass>, und da bekomme ich viele Fehlermeldung vom Kompiler, zB:
>c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector(717) : error C2719: '_Val': Formeller Parameter mit __declspec(align('16')) wird nicht ausgerichtet
1> d:\programmierung\projekte\TestApp\TestApp\mesh.h(12): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::vector<_Ty>".
1> with
1> [
1> _Ty=Face
1> ]
Irgendwie kann ich mit der Fehlermeldung nix anfangen.
Weiß von Euch jemand Rat?
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:04
von Krishty
Die Bibliothek verwendet wahrscheinlich Typen, die ausgerichtet sein müssen (also nur an bestimmten glatt teilbaren Adressen im Speicher instanziert werden dürfen,
falls du dich erinnerst). Das unterstützt
::std::vector (noch) nicht, darum kannst du sie nicht darin speichern. Die Warnung soll dich darauf hinweisen.
Benutz entweder eine eigene Array-Klasse mit Alignment-Unterstützung, oder kompiliere für x64 (dort wird vom Entwurf her alles mit ausreichender Ausrichtung platziert), oder verwende statische Arrays. Kann auch sein, dass
std::tr1 was anbietet, weiß ich aber nicht.
Gruß, Ky
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:04
von dot
Naja, du versuchst offen einen std::vector<Face> zu machen wobei Face mit __declspec(align(16)) deklariert ist. Das funktioinert eben nicht da der Compiler nicht sicherstellen kann dass der vector das Alignment richtig macht. Lösung: __declspec weg und eigenen Allocator schreiben der sich drum kümmert das richtig zu machen.
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:14
von Krishty
dot hat geschrieben:Lösung: __declspec weg und eigenen Allocator schreiben
Lösung: __declspec weg
__declspec weg

Damit die Klasse auch im Stapel nicht mehr ausgerichtet wird und man sich schöne Laufzeitfehler einfängt sobald das erste
movaps neben die Tüte greift?
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:16
von dot
Ich ging davon aus dass klar ist dass man dann ein zweites struct ohne __declspec oder was auch immer das is brauchen wird um es in den vector zu packen. Oder eben natürlich noch besser was andres als std::vector wie du schon vorgeschlagen hast...
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 17:19
von Krishty
Es hat halt nicht jeder eine eigene Mathebibliothek geschrieben ;) Man kann auch einfach by Reference übergeben … das provoziert unter VC hier und da einen Speicherzugriff mehr; aber da dieser Müll von Code Generator eh nichts anderes macht als die ganze Zeit sinnlos zwischen Registern, Speicher und FPU hin- und herzuschieben fällt das nicht ins Gewicht. (Das scheint bei mir außerdem irgendwie die Wahrscheinlichkeit von Compiler-Versagen zu senken ;) )
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 19:13
von joggel
Nun gut!
Danke erstmal für die Erklärung :)
Ich schaue mal nach einer Alternative zu std::vector. Da ich keine Ahnung habe, wie das mit dem eigenen Allocator schreiben geht.
Gruß
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 20:13
von Dirk Schulz
Hi,
also eigentlich schaut man bei solchen Problemen erstmal in die Doku ... da könnte man z.b. auf sowas:
http://eigen.tuxfamily.org/dox/TopicStlContainers.html
stoßen! ;)
Re: #define NOMINMAX vs. std::vector
Verfasst: 11.07.2011, 20:19
von joggel
Da schaut man aber auch immer zuletzt nach. :oops: