Sophus(slambook2 ch4)

在使用Eigen的时候,如果STL容器中的元素是Eigen数据库结构,比如下面用vector容器存储Eigen::Matrix4f类型或用map存储Eigen::Vector4f数据类型时:


     
     
  1. vector<Eigen::Matrix4d>;
  2. std:: map< int, Eigen::Vector4f>

这么使用编译能通过,当运行时会报段错误。

对eigen中的固定大小的类使用STL容器的时候,如果直接使用会出错,所谓固定大小(fixed-size)的类是指在编译过程中就已经分配好内存空间的类,为了提高运算速度,对于SSE或者AltiVec指令集,向量化必须要求向量是以16字节即128bit对齐的方式分配内存空间,所以针对这个问题,容器需要使用eigen自己定义的内存分配器,即aligned_allocator。

这个分配器所在头文件为:

#include <Eigen/StdVector>
     
     

根据STL容器的模板类,比如vector的声明:


     
     
  1. template< typename _Tp, typename _Alloc = allocator<_Tp> >
  2. class vector : protected _Vector_base<_Tp, _Alloc>
  3. {
  4. .....
  5. }

使用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中的方法是不一样的,所以需要单独强调元素的内存分配和管理。

参考

sophus教程

Eigen内存分配器aligned_allocator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值