我有一个类ClusterNode
,其中包含Eigen::Matrix4d
作为类变量。我还有一个函数numNodes()
告诉我ClusterNode
的总数,这样我就可以用某种数组,列表或向量来收集它们。
但是,Eigen::Matrix4d
已对齐,这意味着我无法根据此问题的答案在std::vector<ClusterNode>
中存储此类型的对象error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned?
作为替代方案,我尝试过使用数组。
然而,我做不到
const int n = numNodes();
ClusterNode array [n];
因为函数的返回值不被视为常量。
我还有其他选择吗?
答案 0 :(得分:1)
您可以使用Eigen的aligned_allocator。有关详细信息,请参阅this page,但基本上您可以这样做:
std::vector<ClusterNode, Eigen::aligned_allocator<ClusterNode> >
另外,不要忘记为您的班级重载operator new。同样,所有细节都在Eigen的documentation中。
答案 1 :(得分:0)
您可以尝试使用memalign或posix_memalign来分配和对齐变量内存空间
答案 2 :(得分:0)
我最终使用了Alex Faber的解决方案
ClusterNode* array = new ClusterNode[n];
但是我想补充说明,在这种情况下,该类还需要返回指定的指针。它只会在一段时间内以一种非常烦人且无法解决的方式引起问题,但是经过大量的bug搜索后,我终于收到了一条有用的错误消息,指出我Eigen's documentation。
文档摘要:Eigen需要16字节对齐的内存。以下案件将导致悲痛。
如果我使用Alex提出的动态数组解决方案(ClusterNode根本就是变量),我还需要使用Eigen提供的宏来确保对象是对齐的。例如,
class ClusterNode
{
Eigen::Matrix4d M;
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
}
如果未包含宏,则数组声明有时会无提示失败。