2013-04-01 4 views
2

저는 XMVECTOR를 테두리 상자의 클래스 멤버로 사용하려고했습니다. 많은 계산을했기 때문에 XMFLOAT3을 프레임 당 한 번만 사용했기 때문에 테두리 상자에 그 중심을 제공하는 메서드가 있습니다.DirectXMath에서 XMVECTOR를 클래스 멤버로 사용하면 릴리즈 모드에서만 충돌이 발생합니까?

Box& Box::operator=(const Box& box) 
    { 
     _center = box._center; 
     _extents = box._extents; 
     return *this; 
    } 

때마다 :; XMFLOAT3, 그렇지 않으면 그것은 XMVECTOR에 남아 클래스가 __declspec와 delcared되어 그것이 내가 뭔가를 즉시 설정 충돌하는() (16 정렬) 및 릴리스 모드에서 디버그 mode.However에서 작동 나는 :

Box A; 

Box B; 

A = B; 

0xC0000005 : 액세스 위반 읽기 위치 0x00000000이 나에게 충돌이 발생합니다. 이 생성자입니다

Box* A = new Box(); 

: 또한 내가 포인터로 만들 때 충돌이 다시

Box::Box() 
    { 
     center = XMVectorZero(); 
     extents = XMVectorSplatOne(); 
    } 

, 이것은 디버그 모드에서 잘 작동,하지만 릴리스에서 모드를 해제 할 수 crashes.What 잘못된 코드를 생성하는 변경해야합니까? 상자를 16 바이트로 맞춤 이외의 다른 작업을 수행해야합니까?

+0

주를 오버로드 할 것입니다. [DirectXMath] (http://blogs.msdn.com/b/chuckw/archive/2012/03/27/introducing-directxmath.aspx)에는 이미''DirectXCollision.h'' 헤더에''BoundingBox''가 포함되어 있습니다. –

답변

6

클래스가 정렬 된 주소에서 생성되지 않으므로 XM * 멤버가 16 바이트 경계에 정렬되어 있어도 부모의 정렬이 잘못 정렬되어 충돌이 발생합니다.

_mm_alloc (실제로는 단지 _aligned_alloc을 감싸는)을 사용하거나 기본 할당자가 16 바이트에 최소로 정렬 된 블록을 반환하는 것으로 바꾸어야합니다 (x64에서는 기본 할당 자의 경우).

C++에서이에 대한 간단한 해결책처럼 보이는 * (가) XM를 포함하는 모든 클래스에 대한 기본 클래스를 만들 회원입니다 다음

는 바와 같이 @ 데이브 지적
template<size_t Alignment> class AlignedAllocationPolicy 
{ 
    public: 
    static void* operator new(size_t size) 
    { 
     return _aligned_malloc(size,Alienment); 
    } 

    static void operator delete(void* memory) 
    { 
     _aligned_free(memory); 
    } 
}; 

class MyAlignedObject : public AlignedAllocationPolicy<16> 
{ 
//... 
}; 

, 이것은 최소한의 예입니다 , 당신은 모든newdelete 사업자, 특히 new[] 그리고 당신은``Box`` 클래스를 만들 필요가 없습니다 delete[]

+0

그래서 declspec을 더 이상 정렬 할 필요가 없습니다. 같은 일을해서는 안되며, _mm_alloc은 __m128 멤버가있는 클래스에 특화되어 있습니까? –

+0

@DEIMOS :'__declspec (align())'에 대한 MSDN 페이지에서 가져온 것 : malloc, C++ operator new, Win32 allocators와 같은 일반 할당 자들은 __declspec에 대해 충분히 정렬되지 않은 메모리를 반환합니다 (#)) 구조체 또는 배열을 배열 할 수 있습니다. '따라서 스택/스택 변수와 구조체/클래스 오프셋 정렬과 같이 컴파일러가 제어 할 수있는 할당에만 영향을 미칩니다. '_mm_malloc'과'_aligned_malloc'은 올바르게 할당 된 데이터를 반환하며'_mm_malloc'은 SSE 타입의 매크로 속기입니다. – Necrolis

+2

xmmath에 대한이 주제에 대한 다른 설명은 http://msdn.microsoft.com/en-us/library/windows/desktop/ee418725(v=vs.85).aspx의 유형 사용 지침을 참조하십시오. – Yostage