私のプロジェクトでは、使用するポイント タイプを から に変更したところEigen::Vector2f
、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に関するサブセクション。そして、私には2つのオプションがあるようです:
- 使用
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
ですか?- これはアライメントのせいですか?
- どうにかして初期化子リストを揃えることはできますか?
特殊化バージョンが失敗するのはなぜですか?
- これらには初期化子リスト機能がありませんか?