【发布时间】:2013-11-24 08:30:01
【问题描述】:
我有一堂课:
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 关于对齐的文章,但不清楚它是否适用于动态分配。
【问题讨论】:
-
不,这行不通,C++ 中臭名昭著的问题。编译器知道对象的对齐要求,但没有任何方法将该知识传递给分配器。在语言规范中解决这个问题是一个重大的突破性变化。
标签: c++ windows visual-c++ memory-alignment