sse指令的小不明白
最近尝试用sse指令来改我的数学库,但是遇到些问题。比如我自定义一个类Vector,类似:
#pragma once
#include <xmmintrin.h>
namespace Pillow
{
namespace Math
{
class Vector
{
private:
__m128 data;
public:
float &x;
float &y;
float &z;
float &w;
public:
Vector(void)
:x(data.m128_f32[0]),
y(data.m128_f32[1]),
z(data.m128_f32[2]),
w(data.m128_f32[3])
{
data.m128_f32[0]=0.0f;
data.m128_f32[1]=0.0f;
data.m128_f32[2]=0.0f;
data.m128_f32[3]=1.0f;
};
........
friend void operator+=(Vector& v1, const Vector& v2);
public:
~Vector(void){};
};
inline void operator+=(Vector& v1,const Vector& v2)
{
v1.data=_mm_add_ps(v1.data,v2.data);
}
}
}
然后测试的时候,如果我这样就没问题:
Pillow::Math::Vector v1;
Pillow::Math::Vector v2;
v1+=v2;
但是这样就会出现access violation的错误:
Pillow::Math::Vector *v1=new Pillow::Math::Vector();
Pillow::Math::Vector *v2=new Pillow::Math::Vector();
(*v1)+=(*v2);
后来我在codeguru上问到:如果类中包含__m128类型的成员,需要用_aligned_malloc和_aligned_free重载new和delete。然后我就在类里添加如下内容就解决了:
static void* operator new(size_t size)
{
void *p=_aligned_malloc(size,512);
return p;
};
static void operator delete (void *p)
{
_aligned_free(p);
}
但是我还是不知道为什么。不知道这个问题是否和我的amd有关,还是说intel的运行也一样?
No comments:
Post a Comment