关于内存所有权转让以及右值引用的修改
背景:在TUM dynamic数据集下,当前算法与22年出现的同类算法,在精度持平的情况下,运行速度及内存占有量方面有明显的不足。
解决方法:在原理暂时无法突破的情况下执行代码层面的优化
代码层面优化间述:
1.将基于拷贝的方法转换成基于内存所有权转让的方法
2.使用右值引用解决函数返回值的内存所有权转让的问题
什么是左值和右值
int a = 1;
int b = a;
在c中左值一般是一个指向特定内存的值,有一个相对稳定的内存地址,有一段较长的ttl,右值则是不指向稳定内存地址的匿名值,通常是暂时性的
&1
lvalue required as unary ‘&’ operand
Vector2d EdgeSE3ProjectXYZ::cam_project(const Vector3d & trans_xyz)
函数的返回值是临时变量是一个右值
平时我们如何留下这个临时变量呢?
Vector2d myvector = cam_project(trans_xyz);
这个等于号重载的就是一个基于拷贝的方法
Vector2d operator = (const Vector2d& b) //右 拷贝
Vector2d operator = (Vector2d& b)//左 转让
右值引用为了解决这个问题被提出
Vector2d oeperator = (Vector2d&& b)
std::move仅仅将实参类型转为右值引用,使得发生移动拷贝或移动赋值行为,这要求实参对应的类型实现了移动构造函数或移动赋值函数,否则编译错误
slam算法的数据交互是非常频繁的,使用这种内存所有权转让的代码优化方法加速是非常明显的,可惜的是代码层面上的优化不能作为创新点,对于右值引用的方法,最新的GIThub上
的某些开源代码,也已经开始使用,也是我发现这种方法的来源。