J'essaie d'obtenir la fonctionnalité SSE dans ma classe de vecteurs (je l'ai réécrit trois fois jusqu'à présent.: \) Et je fais ce qui suit:Donner une instance d'une classe un pointeur à une structure
#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
Cela fonctionne! Hourra! Mais c'est plus lent que ma tentative précédente. Huer.
J'ai déterminé que mon col de bouteille est le malloc que j'utilise pour obtenir un pointeur vers une structure.
VectorData* Point3D::_NewData()
{
#if SSE_VERSION >= 2
return ((VectorData*) _aligned_malloc(sizeof(VectorData), 16));
#else
return ((VectorData*) malloc(sizeof(VectorData)));
#endif
}
L'un des principaux problèmes avec l'utilisation SSE dans une classe est qu'il doit être stocké en mémoire pour que cela fonctionne, ce qui signifie une surcharge de la nouvelle et de supprimer les opérateurs, ce qui code comme ceci:
BadVector* test1 = new BadVector(1, 2, 3);
BadVector* test2 = new BadVector(4, 5, 6);
*test1 *= test2;
Vous ne pouvez plus utiliser le constructeur par défaut et vous devez éviter new
comme la peste.
Ma nouvelle approche consiste essentiellement à avoir les données externes de la classe afin que la classe ne doive pas être alignée.
Ma question est la suivante: y a-t-il un meilleur moyen d'obtenir un pointeur vers une instance (alignée sur la mémoire) d'une structure ou est-ce que mon approche est vraiment bête?
Vous voulez dire _declspec, je suppose? – cedrou
LOL n'a vraiment pas remarqué cette faute de frappe !! – Goz