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 之类的.或者其它,
  • 大部分情况能直接使用请直接使用,编译器自己会优化.
  • 如果一定要对类提前定义,如果可以用引用,请用引用方式.