我有一个班级:
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文章,但目前还不清楚它是否适用于动态分配。
答案 0 :(得分:7)
由于__declspec(align(#))
是编译指令,因此使用new运算符创建MatrixWrapper
对象可能会导致堆上的未对齐内存。您可以考虑使用_aligned_malloc并动态分配内存,例如在构造函数中,然后在析构函数中使用_aligned_free
释放它,通过混合对象的静态和动态分配会使事情变得更加困难。< / p>