【问题标题】:In which cases can __declspec( align( # ) ) not work?在哪些情况下 __declspec( align( # ) ) 不起作用?
【发布时间】: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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2018-11-28
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多