구조물에 대한 클래스 A 포인터 인스턴스 제공
-
05-07-2019 - |
문제
벡터 클래스에서 SSE 기능을 얻으려고 노력하고 있습니다 (지금까지 세 번 다시 작성했습니다. : ).
#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
효과가있다! 만세! 그러나 그것은 나의 이전 시도보다 느립니다. 우우.
나는 내 병 목이 구조물에 대한 포인터를 얻기 위해 사용하는 malloc이라고 결정했습니다.
VectorData* Point3D::_NewData()
{
#if SSE_VERSION >= 2
return ((VectorData*) _aligned_malloc(sizeof(VectorData), 16));
#else
return ((VectorData*) malloc(sizeof(VectorData)));
#endif
}
클래스에서 SSE를 사용하는 데있어 주요 문제 중 하나는 작동하기 위해 메모리에 정렬되어야한다는 것입니다. 즉, 새로운 연산자와 삭제하는 연산자를 과부하시키기 때문에 다음과 같은 코드가 나타납니다.
BadVector* test1 = new BadVector(1, 2, 3);
BadVector* test2 = new BadVector(4, 5, 6);
*test1 *= test2;
더 이상 기본 생성자를 사용할 수 없으며 피해야합니다. new
전염병처럼.
내 새로운 접근법은 기본적으로 클래스의 외부 데이터를 클래스의 외부에 두는 것이므로 클래스를 정렬 할 필요가 없습니다.
내 질문은 : 구조물의 (메모리에 정렬 된) 인스턴스에 대한 포인터를 얻는 더 좋은 방법이 있습니까?
해결책
어때요 :
__declspec( align( 16 ) ) VectorData vd;
?
다음과 같이 나만의 운영자 버전을 만들 수도 있습니다.
void* operator new( size_t size, size_t alignment )
{
return __aligned_malloc( size, alignment );
}
그런 다음 할당을 따를 수 있습니다
AlignedData* pData = new( 16 ) AlignedData;
16 바이트 경계에서 정렬합니다.
그것이 도움이되지 않으면 당신이 요구하는 것을 오해 할 수 있습니다 ...
다른 팁
일회용 벡터에 대한 성능이 향상 될 것으로 예상해서는 안됩니다. 병렬 처리와 병렬 처리를 일부 볼륨과 결합 할 수있을 때 가장 밝게 빛납니다. 많은 순서대로 벡터.
나는 그것을 고쳤다. :영형
정말 쉬웠습니다. 내가해야 할 일은 바뀌는 것뿐이었습니다
VectorData* m_Point;
~ 안으로
VectorData m_Point;
그리고 Malloc이나 정렬이 필요하지 않고 내 문제가 사라졌습니다.
하지만 모두의 도움에 감사드립니다! :디