3

我有一堂课:

class CMatrix4f
{
public:
    CMatrix4f();

public:
     __declspec(align(16)) float m[16];
};

此类使用 SSE 实现矩阵运算,因此m 必须对齐才能使其工作。它在大多数情况下都有效,但有时在执行 SSE 指令时会出现段错误,例如_mm_load_ps因为m不是 16 字节对齐。到目前为止,我无法理解它发生在哪些情况下。

当我这样做时CMatrix4f * dynamicMatrix = new CMatrix4f();,是否dynamicMatrix.m保证对齐?

如果我有一堂课:

class MatrixWrapper {
public:
   MatrixWrapper();

   CMatrix4f _matrix;
};

然后做:

MatrixWrapper * dynamicMatrixWrapper = new MatrixWrapper();

dynamicMatrixWrapper._matrix.m保证对齐?

我已阅读有关对齐的 MSDN 文章,但尚不清楚它是否适用于动态分配。

4

1 回答 1

7

因为__declspec(align(#))是一个编译指令,MatrixWrapper使用 new 运算符创建对象可能会导致堆上的内存未对齐。您可以考虑使用 _aligned_malloc并动态分配内存,例如在构造函数中,然后_aligned_free在析构函数中使用释放它,因为混合对象的静态和动态分配会使事情变得更加困难。

于 2013-11-12T09:41:44.103 回答