特征不对齐断言

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_ptrs。由于您必须自己使用堆分配的对象初始化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::vector > 适用于 Eigen 对象的向量,我将如何处理 FOO* 的向量?我将如何构建自己的分配器? 您应该能够通过其std::allocator 接口使用 Eigen 分配器...但我没有经验。 这里有两个问题.. FOO 内部 Eigen 成员的对齐方式和 FOO* 向量的对齐方式...假设 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 负责重载新运算符.. std:: shared_ptr 会调用新的重载运算符本身吗? 这与这里面临和解决的问题相似 --> pcl-users.org/… 不同之处在于我不调用 make_shared。 resize 如何进行重新分配?【参考方案2】:

不好意思承认,但 std::_Allocate 中的崩溃与内存不足问题有关。我被愚弄以为它们与对齐问题有关。

【讨论】:

以上是关于特征不对齐断言的主要内容,如果未能解决你的问题,请参考以下文章

[OpenCV实战]19 使用OpenCV实现基于特征的图像对齐

从字节数组加载 uint8x16_t 的对齐要求?

如何检测将显微镜图像旋转对齐到模板的良好特征

图像对齐(图像配准)方法记录

FPN vs FCN

不同设备宽度的不同尺寸和视图对齐方式