C++ 在哪些情况下u declspec(align(#))不起作用?

C++ 在哪些情况下u declspec(align(#))不起作用?,c++,windows,visual-c++,memory-alignment,C++,Windows,Visual C++,Memory Alignment,我有一门课: class CMatrix4f { public: CMatrix4f(); public: __declspec(align(16)) float m[16]; }; class MatrixWrapper { public: MatrixWrapper(); CMatrix4f _matrix; }; 该类使用SSE实现矩阵运算,因此m必须对齐才能工作。它在大多数情况下都能工作,但有时在执行SSE指令(如\u mm\u load\u ps)

我有一门课:

class CMatrix4f
{
public:
    CMatrix4f();

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

   CMatrix4f _matrix;
};
该类使用SSE实现矩阵运算,因此
m
必须对齐才能工作。它在大多数情况下都能工作,但有时在执行SSE指令(如
\u mm\u load\u ps
)时会出现SEGFULT,因为
m
没有16字节对齐。到目前为止,我不知道在什么情况下会发生这种情况

当我执行
CMatrix4f*dynamicMatrix=new CMatrix4f()时
dynamicMatrix.m
是否保证对齐

如果我有课:

class CMatrix4f
{
public:
    CMatrix4f();

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

   CMatrix4f _matrix;
};
然后做:

MatrixWrapper * dynamicMatrixWrapper = new MatrixWrapper();
dynamicMatrix.m
是否保证对齐


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

因为
\u declspec(align(#))
是一个编译指令,使用新操作符创建
MatrixWrapper
对象可能会导致堆上的内存未对齐。你可以考虑使用和分配内存,例如在构造函数中,然后在析构函数中使用< C++ > ApigeNeDelFix//Cube免费释放它。通过混合静态和动态的对象分配方式,事情变得更加困难。

不,这将不起作用,在C++中臭名昭著的问题。编译器知道对象的对齐要求,但没有任何方法将这些知识传递给分配器。在语言规范中解决这个问题是一个重大的突破性变化。尽管微软说#可能高达8192,但实际上我得到的错误是#>128。你看到了吗?这是MS文档-。