Friday, December 08, 2006

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: