首页 > 编程语言 >C++性能优化——返回vector作为返回类型的函数

C++性能优化——返回vector作为返回类型的函数

时间:2023-04-19 16:15:02浏览次数:33  
标签:返回 std frame C++ vector ptr association size

方案/设计描述

代码性能优化:使用引用获取计算结果,优化GetLatestM2MAssociationResult函数

  1. 此函数返回类型为vector的函数,在开启编译器优化时,是会进行返回值优化(RVO,Return Value Optimization)的,会避免返回时和获取返回值时的拷贝。但某些编译器不一定优化,因此改为在函数中增加一个vector类型的引用参数。
  2. GetLatestM2MAssociationResult中做上述修改,从m2m_association_result_中获取vector时,仍然会造成到vector拷贝。因此m2m_association_results_的value类型改为std::shared_ptr<std::vector>类型,实现共享vector,避免拷贝。可能存在的隐患:潜在的循环引用,造成内存泄漏。
using M2MIndexPairsPtr = std::shared_ptr<std::vector<MeasurementMeasurementIndexPair>>;
  1. m2m_association_results_原来定义为std::map,查询时间复杂度为O(logN)。因为并不要求Key有序,只做查询,因此改为std::unordered_map,查询时间复杂度为O(1)。
std::unordered_map<AssociateType, M2MIndexPairsPtr> m2m_association_results_;
  1. MultiSensorFusion::CollectM2MAssociateResult 中更新哈希表m2m_association_result_时,使用std::move()将局部变量vector所有权转移到std::shared_ptr的构造函数,避免了拷贝。
  2. 避免在for循环条件中调用函数,否则每次迭代都会进行函数调用(以及指针调用)。提前保存在局部变量中,则只会进行一次调用。
for (size_t j = 0U; j < latest_radar_frame->GetForegroundObjects().size(); ++j) {
    ...
}

改为

size_t foreground_objects_size = latest_radar_frame->GetForegroundObjects().size();
for (size_t j = 0U; j < foreground_objects_size; ++j) {

}
  1. 用一个传感器frame更新另一个传感器frame的处理逻辑有很多重复代码,封装成了两个函数减少重复,提升代码可读性。
	
void MultiSensorFusion::UpdatePairSecondFrameAssociationResultWithPairFirst(const M2MIndexPairsPtr& association_result_ptr,
                                                             SensorFramePtr& source_frame_ptr,
                                                             SensorFramePtr& target_frame_ptr, const size_t index);
void MultiSensorFusion::UpdatePairFirstFrameAssociationResultWithPairSecond(const M2MIndexPairsPtr& association_result_ptr,
                                                             SensorFramePtr& source_frame, 
                                                             SensorFramePtr& target_frame, const size_t index);

标签:返回,std,frame,C++,vector,ptr,association,size
From: https://www.cnblogs.com/qiangz/p/17333627.html

相关文章

  • 龙芯派二代2k1000la开发——交叉编译环境搭建(C/C++和Qtcreator)
    龙芯派二代2k1000la开发——交叉编译环境搭建(C/C++和Qtcreator)一、下载脚本文件这个脚本文件可以在龙芯技术支持QQ群中找到二、编译C/C++程序在下载目录下执行该脚本./poky-glibc-x86_64-my-qt5-image-loongarch64-ls3a5000-toolchain-3.3+snapshot.shBash设置环境变量source/opt......
  • C++小型公司工资管理系统[2023-04-19]
    C++小型公司工资管理系统[2023-04-19]小型公司工资管理系统要求:1.公司主有4类人员:经理、技术员、销售员、销售经理。要求存储这些人的职工号、姓名、月工资、岗位、年龄、性别等信息。2.工资的计算方法:a、经理:固定月薪为8000;b、技术员:工作时间*小时工资(100元每小时);c、销售员:销......
  • 【web 开发基础】PHP 自定义函数之函数的返回值-PHP 快速入门 (27)
    前言在定义函数时,函数名后面括号中的参数列表是用户在调用函数时用来将数据传递到函数内部的接口,而函数的返回值则将函数执行后的结果返回给调用者。如果函数没有返回值,就只能算一个执行过程。只依靠函数做一些事情还不够,有时更需要在程序脚本中使用函数执行后的结果。由于变量的作......
  • c&c++ 的window环境获取exe文件所在的目录
    #include <iostream>#include<stdio.h>#include <direct.h>#include <windows.h>#include<process.h>#include <atlstr.h>charbuff[MAX_PATH];//用于存放获取的路径信息。GetModuleFileName(NULL,buff,MAX_PATH);CStringstr2=buff;int......
  • c++打卡第九天
    一、问题描述。   有一辆撞人逃逸的车辆,有三人目击他的车牌号,其中一人说它的前两数是相同的,零一人说它的后两位是相同的,第三个人说,这四位数是一个整数的平方,如何求解这个车牌号。二、设计思路。    ①、对于此类求解问题,需要采用穷举法,对这个车牌号进行开方是否......
  • C++恶意软件开发(四)通过查找进程名进行DLL注入
    通过进程名查找PID当我们编写注入器的时候,肯定是希望直接通过进程名进行注入,而不是像上一篇笔记一样通过手动输入PID进行查找。通过进程名查找PID的步骤如下:(1)创建系统中所有进程的快照(2)保存系统快照中遇到的第一个进程的信息(3)循环检索系统中进程的信息是否匹配需要查......
  • C++ const关键字
    参考资料:【C++const的各种用法详解】【const用法深入浅出】-COS-博客园(cnblogs.com)const的基本概念:const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。下面我就const的用法......
  • cpp:Double Dimensional Array using vector 2
     //StudentArry.h:此文件包含"StudentArry"类。学生数组成绩显示方法C++14//2023年4月9日涂聚文GeovinDuedit.//(1)vec1.size()就是”二维数组”的行数//(2)vec1[0].size()就是”二维数组”的列数//vector<vector<double>>geovindu#pragmaonce#ifndefSTUD......
  • 打卡 无规矩不成方圆 - C/C++ 多态
    请结合如图所示的继承关系设计Shape、Circle以及Rectangle类,使得下述代码可以正确计算并输出矩形和圆的面积。提示:Shape的析构以及area()函数都应为虚函数。  裁判测试程序样例://Project-Shapes#include<iostream>usingnamespacestd;//在此处定义Shape,Cirlce及......
  • c++_Template
    c++_Templatestd::stringMemberfunctions:Iterators:beginReturniteratortobeginning(publicmemberfunction)endReturniteratortoend(publicmemberfunction)rbeginReturnreverseiteratortoreversebeginning(publicmemberfunction)rend......