Geben Sie eine Instanz einer Klasse einen Zeiger auf eine Struktur
-
05-07-2019 - |
Frage
Ich versuche, SSE-Funktionalität in meiner Vektor-Klasse zu bekommen (ich habe umgeschrieben es dreimal so weit. \) Und ich tue das folgende:
#ifndef _POINT_FINAL_H_
#define _POINT_FINAL_H_
#include "math.h"
namespace Vector3D
{
#define SSE_VERSION 3
#if SSE_VERSION >= 2
#include <emmintrin.h> // SSE2
#if SSE_VERSION >= 3
#include <pmmintrin.h> // SSE3
#endif
#else
#include <stdlib.h>
#endif
#if SSE_VERSION >= 2
typedef union { __m128 vector; float numbers[4]; } VectorData;
//typedef union { __m128 vector; struct { float x, y, z, w; }; } VectorData;
#else
typedef struct { float x, y, z, w; } VectorData;
#endif
class Point3D
{
public:
Point3D();
Point3D(float a_X, float a_Y, float a_Z);
Point3D(VectorData* a_Data);
~Point3D();
// a lot of not-so-interesting functions
private:
VectorData* _NewData();
}; // class Point3D
}; // namespace Vector3D
#endif
Es funktioniert! Hurra! Aber es ist langsamer als mein vorheriger Versuch. Boo.
Ich habe festgestellt, dass mein Flaschenhals ist die malloc Ich verwende einen Zeiger auf eine Struktur zu erhalten.
VectorData* Point3D::_NewData()
{
#if SSE_VERSION >= 2
return ((VectorData*) _aligned_malloc(sizeof(VectorData), 16));
#else
return ((VectorData*) malloc(sizeof(VectorData)));
#endif
}
Eines der Hauptprobleme bei der Verwendung von SSE in einer Klasse ist, dass es im Speicher ausgerichtet werden muss, für sie zu arbeiten, was bedeutet, dass die neuen und löschen Operatoren Überlastung, was zu Code wie folgt:
BadVector* test1 = new BadVector(1, 2, 3);
BadVector* test2 = new BadVector(4, 5, 6);
*test1 *= test2;
Sie können nicht mehr den Standard-Konstruktor verwenden, und Sie haben new
wie die Pest zu vermeiden.
Mein neuer Ansatz ist im Grunde die Daten aus der Klasse extern haben, so dass die Klasse nicht ausgerichtet werden muss.
Meine Frage ist: Gibt es einen besseren Weg, um einen Zeiger auf eine (ausgerichtet auf Speicher) Instanz einer Struktur oder ist mein Ansatz wirklich dumm und es gibt einen viel sauberen Weg
zu bekommenLösung
Wie wäre:
__declspec( align( 16 ) ) VectorData vd;
Sie können auch Ihre eigene Version des Bedieners neu wie folgt erstellen
void* operator new( size_t size, size_t alignment )
{
return __aligned_malloc( size, alignment );
}
die dann machen allocationas folgt
AlignedData* pData = new( 16 ) AlignedData;
bei einer 16-Byte-Grenze auszurichten.
Wenn das ist keine Hilfe dann kann ich Missverständnis, was Sie fordern für ...
Andere Tipps
Sie sollten wahrscheinlich nicht erwarten, dass eine verbesserte Leistung für Einweg- Vektoren zu erhalten. Die Parallelverarbeitung leuchtet am hellsten, wenn Sie die parallele Verarbeitung mit einigen Volumen kombinieren können, das heißt bei der Verarbeitung von viele Vektoren in Folge.
Ich reparierte es. : O
Es war wirklich ziemlich einfach. Alles, was ich war drehen zu tun hatte
VectorData* m_Point;
in
VectorData m_Point;
und meine Probleme sind weg, ohne die Notwendigkeit für malloc oder Ausrichtung.
Aber ich schätze die Hilfe aller! : D