#define NOMINMAX vs. std::vector

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
joggel

#define NOMINMAX vs. std::vector

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: #define NOMINMAX vs. std::vector

Beitrag 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
Zuletzt geändert von Krishty am 11.07.2011, 17:07, insgesamt 3-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: #define NOMINMAX vs. std::vector

Beitrag 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.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: #define NOMINMAX vs. std::vector

Beitrag von Krishty »

dot hat geschrieben:Lösung: __declspec weg und eigenen Allocator schreiben
Lösung: __declspec weg
__declspec weg
Bild
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?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: #define NOMINMAX vs. std::vector

Beitrag 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...
Zuletzt geändert von dot am 11.07.2011, 17:20, insgesamt 2-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: #define NOMINMAX vs. std::vector

Beitrag 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 ;) )
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: #define NOMINMAX vs. std::vector

Beitrag 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ß
Dirk Schulz
Establishment
Beiträge: 130
Registriert: 01.03.2009, 14:21
Alter Benutzername: frittentuete

Re: #define NOMINMAX vs. std::vector

Beitrag 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! ;)
joggel

Re: #define NOMINMAX vs. std::vector

Beitrag von joggel »

Da schaut man aber auch immer zuletzt nach. :oops:
Antworten