特征不对齐断言
Posted
技术标签:
【中文标题】特征不对齐断言【英文标题】:Eigen unaligned assert 【发布时间】:2013-08-06 19:31:37 【问题描述】:我正在使用 Eigen 3.1.2,并且能够毫无问题地构建我的应用程序的 64 位目标。当我构建一个 32 位目标时,我得到了很多“未对齐”的断言。因此,我遵循workaround,在我的所有类中定义 EIGEN_MAKE_ALIGNED_OPERATOR_NEW,并对所有 STL 容器使用 Eigen::aligned_allocator。这似乎已经处理了所有的断言。但是,在调试模式下,我会在某个时候崩溃。这是崩溃的地方:
m_container.resize(N)
这是对 m_container 的调整大小操作,它是 std::vector<std::vector<std::vector<pFOO> > >
(pFOO 的 3D 数组),其中 pFOO 是指向 FOO 对象的指针。我正在使用pFOO = std::shared_ptr<FOO>
定义指针。此外,FOO 类有一些 Eigen 成员,我在该类中定义了一个公共 EIGEN_MAKE_ALIGNED_OPERATOR_NEW。 std::shared_ptr<FOO>
默认会使用对齐的分配器吗?为什么它会在调整大小操作时崩溃?我还能尝试什么?
编辑: Eigen 文档中建议的解决方法指出,对于包含 Eigen 成员的类的 STL 容器,我必须使用 Eigen::aligned_allocator 作为 std::vector 声明的附加参数。就我而言,我有一个 std::vector pointers 指向包含 Eigen 成员的类。我依靠 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 来进行对齐分配,并且没有在 std::vector 声明中使用 Eigen::aligned_allocator。
【问题讨论】:
resize(N)
的哪一行或子程序导致崩溃?
@japreiss 崩溃发生在 std::_Allocate 的以下几行: if (_Count == 0) ;否则 if (((size_t)(-1) / sizeof (_Ty)
【参考方案1】:
Eigen 的文档是指直接使用 Eigen 对象的 vector
,而不是指向 Eigen 对象的指针向量。 allocator
参数不会传递给shared_ptr
s。由于您必须自己使用堆分配的对象初始化shared_ptr
[1],因此您有责任以正确的对齐方式进行分配。
[1]http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
【讨论】:
有什么办法,我可以为此目的使用提供的分配器eigen.tuxfamily.org/dox/classEigen_1_1aligned__allocator.html?我该如何申报?例如, std::vectorstd::allocator
接口使用 Eigen 分配器...但我没有经验。
这里有两个问题.. FOO 内部 Eigen 成员的对齐方式和 FOO* 向量的对齐方式...假设 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 负责重载新运算符.. std:: shared_ptr 会调用新的重载运算符本身吗?
这与这里面临和解决的问题相似 --> pcl-users.org/… 不同之处在于我不调用 make_shared。 resize 如何进行重新分配?【参考方案2】:
不好意思承认,但 std::_Allocate 中的崩溃与内存不足问题有关。我被愚弄以为它们与对齐问题有关。
【讨论】:
以上是关于特征不对齐断言的主要内容,如果未能解决你的问题,请参考以下文章