我正在使用 Eigen 3.1.2,并且我能够毫无问题地构建我的应用程序的 64 位目标。当我构建 32 位目标时,我得到了很多“未对齐”的断言。所以我按照workaround通过在我的所有类中定义 EIGEN_MAKE_ALIGNED_OPERATOR_NEW,并对所有 STL 容器使用 Eigen::aligned_allocator。这似乎已经解决了所有的断言。但是,在 Debug模式下,我在某个时刻崩溃了。这是崩溃的地方:
m_container.resize(N)
这是对 m_container 的大小调整操作,它是 std::vector<std::vector<std::vector<pFOO> > >
(pFOO 的 3D 数组),其中 pFOO 是指向 FOO 对象的指针。我使用 pFOO = std::shared_ptr<FOO>
定义指针。另外,类 FOO 有一些 Eigen 成员,我在类中定义了一个公共(public) EIGEN_MAKE_ALIGNED_OPERATOR_NEW 。会std::shared_ptr<FOO>
默认使用对齐分配器?调整大小操作时它会崩溃的任何原因吗?我还能尝试什么?
编辑: Eigen 文档中建议的解决方法指出,对于包含 Eigen 成员的类的 STL 容器,我必须使用 Eigen::aligned_allocator 作为 std::vector 声明的附加参数。就我而言,我有一个指向包含 Eigen 成员的类的 指针 的 std::vector 。我依靠 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 进行对齐分配,并且没有在 std::vector 声明中使用 Eigen::aligned_allocator。
最佳答案
Eigen 的文档是指直接使用 Eigen 对象的 vector
,而不是指向 Eigen 对象的指针 vector 。 allocator
参数不会传递给 shared_ptr
。由于您必须自己使用堆分配的对象初始化 shared_ptr
[1],因此您有责任以正确的对齐方式进行分配。
[1] http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
关于c++ - 特征未对齐断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18088881/