Eigen3 内存对齐问题
参考官方文档
如何设置取消内存对齐的操作没找到
以下内存对齐问题c++17好像不需要考虑可以在
CMakeLists.txt
中添加set(CMAKE_CXX_STANDARD 17)
指定编译器使用c++17
主要分为以下3种情形:
主要每种情形是相互独立考虑的。比如即使在
class
中使用了EIGEN_MAKE_ALIGNED_OPERATOR_NEW
宏定义,但是当在该class
中继续使用STL
容器来存储Eigen
数据类型时候还是需要对其设置分配Eigen::aligned_allocator
内存方式。
以 Eigen 对象为class成员的结构
class Foo
{
...
Eigen::Vector4d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
定义class
时候加入Eigen3
提供的宏
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
使用STL容器或手动内存分配
- 数组容器
使用内存对齐的方式定义
std::vector<Eigen::Vector4f,Eigen::aligned_allocator<Eigen::Vector4f> >
- 有序容器
使用内存对齐的方式定义,有序容器还要知道数据类型的排序方式。
std::map<int, Eigen::Vector4d, std::less<int>,
Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4d> > >
将 Eigen 对象按值传递给函数
c++中的值传递涉及拷贝操作,内存对齐会出错。
- 使用如下方式取代值传递
void my_function(Eigen::Vector2d v);
void my_function(const Eigen::Vector2d& v);
- 值传递包含
Eigen
数据类型的class
时
struct Foo
{
Eigen::Vector2d v;
};
void my_function(Foo v);
void my_function(const Foo& v);