好的,所以我刚刚开始在代码中使用C内部函数,并且创建了一个类,该类简化如下:

class _Vector3D
{
public:
_Vector3D()
{
    aVals[0] = _mm_setzero_ps();
    aVals[1] = _mm_setzero_ps();
    aVals[2] = _mm_setzero_ps();
}
~_Vector3D() {}
private:
__m128 aVals[3];
};

到现在为止还挺好。但是当我使用_Vector3D成员创建第二个类时,出现了问题:
class RayPacket
{
public:
RayPacket() {orig = _Vector3D(); dir = _Vector3D(); power = _mm_setzero_ps();}
~RayPacket() {}

RayPacket(_Vector3D origins, _Vector3D directions, float pow)
{
    orig = origins;
    dir = directions;
    power = _mm_set_ps1(pow);
}

_Vector3D orig;
_Vector3D dir;
__m128 power;
};

我收到以下错误:

错误C2719:'origins':__declspec(align('16'))的形式参数将不对齐

指向构造函数重载:
RayPacket(_Vector3D origins, _Vector3D directions, float pow)

所以我会以错误的方式来做这件事吗?我应该改用struct还是可以使其与类一起使用?

最佳答案

该答案基于文档和猜测,而不是实际知识。谨防!

documentation for __m128说:



因此,通过在类中使用__m128成员,这将强制编译器在16个字节的边界上对齐类的实例。隐式地,将__declspec(align(16))添加到您的类中,但这是not allowed on function parameters,因为编译器很难(不能)在堆栈框架内强制对齐。

解决方法是,尝试通过引用传递构造函数参数:

RayPacket(_Vector3D const &origins, _Vector3D const &directions, float pow)

关于c++ - 在类中使用C内部函数和内存对齐困难,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1639545/

10-12 17:10
查看更多