在哪些情况下__declspec(对齐(#))不起作用?

时间:2013-11-12 09:07:08

标签: c++ windows visual-c++ memory-alignment

我有一个班级:

class CMatrix4f
{
public:
    CMatrix4f();

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

此类使用SSE实现矩阵运算,因此m 必须才能使其正常工作。它大部分时间都可以工作,但有时候我会在执行像_mm_load_ps这样的SSE指令时遇到段错误,因为m不是16字节对齐的。到目前为止,我无法理解它发生在哪些情况。

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

如果我有课:

class MatrixWrapper {
public:
   MatrixWrapper();

   CMatrix4f _matrix;
};

然后做:

MatrixWrapper * dynamicMatrixWrapper = new MatrixWrapper();

dynamicMatrixWrapper._matrix.m是否保证对齐?

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

1 个答案:

答案 0 :(得分:7)

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