在使用Eigen的时候,如果STL容器中的元素是Eigen数据库结构,比如下面用vector容器存储Eigen::Matrix4f类型或用map存储Eigen::Vector4f数据类型时:
-
vector<Eigen::Matrix4d>;
-
std::
map<
int, Eigen::Vector4f>
这么使用编译能通过,当运行时会报段错误。
对eigen中的固定大小的类使用STL容器的时候,如果直接使用会出错,所谓固定大小(fixed-size)的类是指在编译过程中就已经分配好内存空间的类,为了提高运算速度,对于SSE或者AltiVec指令集,向量化必须要求向量是以16字节即128bit对齐的方式分配内存空间,所以针对这个问题,容器需要使用eigen自己定义的内存分配器,即aligned_allocator。
这个分配器所在头文件为:
#include <Eigen/StdVector>
根据STL容器的模板类,比如vector的声明:
-
template<
typename _Tp,
typename _Alloc = allocator<_Tp> >
-
class
vector :
protected _Vector_base<_Tp, _Alloc>
-
{
-
.....
-
}
使用aligned_alloctor分配器,上面的例子正确写法为:
std::vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d>>
std::map<int, Eigen::Vector4f, Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4f>>
上述的这段代码才是标准的定义容器方法,只是我们一般情况下定义容器的元素都是C++中的类型,所以可以省略,这是因为在C++11标准中,aligned_allocator管理C++中的各种数据类型的内存方法是一样的,可以不需要着重写出来。但是在Eigen管理内存和C++11中的方法是不一样的,所以需要单独强调元素的内存分配和管理。