在我的项目中,我将使用的点类型从Eigen::Vector2f
to更改为Eigen::Vector2d
并遇到对齐问题。
这是代码的简化版本:
#include <vector>
#include <Eigen/Eigen>
int main()
{
std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
我收到以下运行时错误:
eigen3/Eigen/src/Core/DenseStorage.h:78: Eigen::internal::plain_array<double, 2, 0, 16>::plain_array() [T = double, Size = 2, MatrixOrArrayOptions = 0, Alignment = 16]: Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
正如 assert-message 所建议的,我阅读了有关Fixed-size vectorizable Eigen objects 所需对齐的信息。还有关于STL Containers的小节。似乎我有两个选择:
- 使用
Eigen::aligned_allocator
- 或使用
EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION
宏。
两种尝试都无法编译(使用 GCC 4.8.3 和 Clang 3.5 测试),因为编译器无法正确转换初始化列表。
这里更改的代码:
#include <vector>
#include <Eigen/Eigen>
#include <Eigen/StdVector>
// EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector2d)
int main()
{
std::vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> points = { {0,0}, {0,1} };
// std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
GCC 错误输出:
error: could not convert ‘{{0, 0}, {0, 1}}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Eigen::Matrix<double, 2, 1>, Eigen::aligned_allocator<Eigen::Matrix<double, 2, 1> > >’
所以我想知道:
为什么更改分配器时初始化列表不可用
std::vector
?- 这是因为对齐吗?
- 我可以以某种方式对齐初始化列表吗?
为什么专业化版本失败?
- 这些是否缺少初始化列表功能?