C++ 降低复制时间
C++ 降低复制时间
目录
一,说明
由于开发过程中需要对大量数据进行处理,因此某些类中含有大数据结构(vector,deque, map等),很多时候需要对结果或者中间过程进行数据转移,c++11以前会消耗非常多CPU和内存资源.c++11后的右值的加入大幅度降低了资源转移时间,将容器复制或者new内存复制的过程变为指针交换的方式,大幅提升性能. 具体实现类似容器的swap功能,但只交换里有的数据.关于右值的具体请参考前面章节的赋值和复制. 注意:右值移走后的对象不要再访问,否则结果未知!! 只适合将生命周期结束的对象赋值给有生命周期的对象. 类的生命周期可以参考: https://blog.csdn.net/qq_20386411/article/details/89415041
二、实例
//修改前
void CLocalSectionMap::reverseMap()
{
std::vector< int > reverse_map;
reverse_map.resize( m_col * m_row, m_default_value); //数组很大
...
CRobotPose2D pose(m_standard_cell.getPose().getY(), m_standard_cell.getPose().getX(), m_standard_cell.getPose().getPhi());
CChainCell standard_cell(m_standard_cell.getIdy(), m_standard_cell.getIdx(), pose);
m_standard_cell = standard_cell; //复制需要时间
m_map = reverse_map; //复制需要特别多的时间
}
//修改后
void CLocalSectionMap::reverseMap()
{
std::vector< int > reverse_map;
reverse_map.resize( m_col * m_row, m_default_value);
...
algo::CRobotPose2D pose( m_standard_cell.getPose().getY(), m_standard_cell.getPose().getX(),
m_standard_cell.getPose().getPhi());
m_standard_cell = algo::CChainCell( m_standard_cell.getIdy(), m_standard_cell.getIdx(), pose); //直接相等,默认调用右值方法
m_map = std::move(reverse_map); //调用右值,大幅提升
//不要继续访问 reverse_map
}
注意:
- 尽量不要提前定义变量,然后再复制 CChainCell standard_cell 之类的.或者其它,
- 大部分情况能直接使用请直接使用,编译器自己会优化.
- 如果一定要对类提前定义,如果可以用引用,请用引用方式.