行列/ベクトル演算ライブラリEigenのクラスの内,Eigen::Matrix4f
やEigen::Affine3f
などの特定のクラスを使用するとき,メモリの配置から生じる問題(公式ドキュメント)に関して,ほぼ公式サイトの要約です.
この問題はEigenのクラスでも特定のクラスにのみ生じる問題なので,該当しないクラスでは気にする必要はないですが,Eigen::Matrix4f
やEigen::Affine3f
は座標変換などでEigenを使う場合にはよく利用するクラスかと思うで,注意が必要です.
具体的に,この問題が生じるのは,以下の場合です.
1. メンバ変数に用いる場合
2. STLコンテナに用いる場合
3. 関数に値渡しする場合
メンバ変数に用いる場合(公式ドキュメント)
メンバ関数で用いる場合には,public
でマクロを定義する.
class Foo
{
...
Eigen::Vector2d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW // このマクロを追加.
...
};
STLコンテナに用いる場合(公式ドキュメント)
STLコンテナを用いる場合には,用意されたallocatorを使う.
例えばstd::vector
の場合には,次のようにする.
#include<Eigen/StdVector>
std::vector<Eigen::Vector4f> v; // こうではなく.
std::vector<Eigen::Vector4f,Eigen::aligned_allocator<Eigen::Vector4f> > v; //こうする.
値渡しする場合(公式ドキュメント)
関数には,値渡しではなく参照を使う.そもそもC++なら参照を使っているはず...
void my_function(Eigen::Vector2d v); // 値渡しではなく,
void my_function(const Eigen::Vector2d& v); // 参照渡しで.