对齐数据类型Eigen::矩阵的数组或向量声明



我有一个类ClusterNode,其中包含一个Eigen::Matrix4d作为类变量。我还有一个函数numNodes(),它告诉我ClusterNode s的总数,这样我就可以把它们收集到某种数组、列表或向量中。

然而,Eigen::Matrix4d是对齐的,这意味着我不能在std::vector<ClusterNode>中存储这种类型的对象,根据这个问题错误的答案C2719: '_Val':形式参数与__declspec(align('16')) won't对齐?

作为一种替代方法,我尝试过使用数组。

然而,我不能做

const int n = numNodes();
ClusterNode array [n];

因为函数的返回值不被认为是常数。

我还有其他选择吗?

您可以使用Eigen的aligned_allocator。详情请参阅本页,但基本上你可以这样做:

std::vector<ClusterNode, Eigen::aligned_allocator<ClusterNode> >

也不要忘记为你的类重载operator new。同样,所有的细节都在Eigen的文档中。

您可以尝试使用memalign或posix_memalign来分配和对齐可变内存空间

http://man.he.net/man3/memalign

我最终使用了Alex Faber的解决方案

ClusterNode* array = new ClusterNode[n];

但是我想补充一点,在这种情况下,类还需要返回已对齐的指针。它只会在部分时间内以一种非常烦人和难以追踪的方式引起问题,但在多次寻找bug之后,我终于得到了一个有用的错误消息,它将我指向了Eigen的文档。

文档摘要:Eigen需要16字节对齐内存。以下情况会导致悲伤。

  1. 包含特征类型的std容器
  2. 类或结构包含特征类型
  3. 通过值传递特征类型给函数
  4. gcc在Windows上有错误对齐(4字节)

如果我使用Alex提出的动态数组解决方案(ClusterNode作为一个变量),我还需要使用Eigen提供的宏来确保对象对齐。例如,

class ClusterNode
{
    Eigen::Matrix4d M;
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} 

如果不包含宏,则数组声明有时会静默失败。

最新更新