c++ - 特征未对齐断言

标签 c++ visual-studio-2012 eigen

我正在使用 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/

相关文章:

c++ - 如何访问文件夹而不是 C++ 中特定文件夹中的文件?

visual-studio-2012 - 多配置生成器中基于 CMake 配置的条件

C++ 部分特化不适用于不同大小的特征矩阵

c++ - 使用 cppcheck 进行多行抑制

java - 了解如何计算二叉树的深度

c++ - 模板特化中的双模板<>

c++ - strcpy() 在 Visual Studio 2012 中的行为

c++ - 在一个非常简单的程序中检测到内存泄漏。该怎么办?

c++ - 为什么 Eigen 矩阵到 C 数组的转换会为前两个索引提供垃圾值?

c++ - 在 C++ 中实现 Rodrigues 的旋转公式时遇到问题