在运行我的程序时,我目前正在检索以下 Eigen 断言:
test_engine: /usr/include/eigen3/Eigen/src/Core/DenseStorage.h:128: Eigen::internal::plain_array::plain_array() [with T = double; int Size = 16; int MatrixOrArrayOptions = 0]: Assertion `(reinterpret_cast(eigen_unaligned_array_assert_workaround_gcc47(array)) & (31)) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
导致此断言的确切代码行是:
std::shared_ptr<Reference> ptr_tmp = std::make_shared<ReferenceLinCart>(cart_traj);
其中 Reference
和 ReferenceLinCart
在公共(public)头文件中定义为:
struct Reference {
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
virtual ~Reference() {}
}
struct ReferenceLinCart : Reference {
Eigen::Transform<double, 3, Eigen::Affine> T_start;
Eigen::Transform<double, 3, Eigen::Affine> T_goal;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
描述中的链接为我提供了有关静态大小结构成员的信息,这就是我添加 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
标志的原因。
使用的 g++ 编译标志是:-march=native -funroll-loops -std=c++11 -Ofast -Wall
不幸的是,我仍在检索相同的运行时断言。关于如何摆脱这个的任何建议?
最佳答案
这是因为 make_shared
不遵守请求的对齐方式,也不使用 operator new
进行分配。您需要使用 allocate_shared使用对齐的分配器(例如,Eigen::aligned_Allocator
)。
关于c++ - 由于固定大小的成员而导致的 Eigen 运行时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48986131/