C++效率咨询:std::vector存储指针与存储自定义对象的性能对比
结论
在当前的目标检测跟踪场景下,将std::vector<Detection>替换为存储Detection指针的容器不仅不会带来效率提升,绝大多数场景下反而会导致性能下降,还会引入额外的内存管理负担。
具体原因
- 首先看当前
Detection类的体积:仅包含3个int类型成员,总大小仅12字节,属于极小的轻量对象,拷贝成本极低。直接存储对象的std::vector是连续内存排布,CPU遍历访问时缓存命中率极高,性能远高于访问指针指向的离散堆内存。 - 存储指针的方案会引入额外开销:如果使用裸指针容器
std::vector<Detection*>,每个Detection对象都需要单独从堆上分配内存,堆分配本身有固定的时间开销,还会产生内存碎片,同时需要手动管理内存释放,稍有不慎就会出现内存泄漏。就算改用智能指针容器解决了内存释放问题,堆分配开销、指针解引用开销、缓存不命中的性能惩罚依然存在。 - 对比现有操作的性能差异:现有代码中涉及到的元素更新、遍历、中间元素删除操作,存储对象的方案都不会比存储指针的方案慢:删除中间元素时需要移动后续元素,单个12字节的对象移动成本和8字节(64位环境)的指针移动成本差距极小;但遍历访问时,连续内存的访问速度远高于需要逐个解引用指针访问堆内存的速度。
补充说明
只有当后续Detection类迭代升级,内部包含大尺寸成员(比如内置像素矩阵、长字符串、复杂类成员),对象拷贝成本远高于指针操作+堆分配开销的总和时,改用指针存储方案才会有性能收益,当前场景做这个改动没有任何收益。
另外你现有代码的tracking方法中存在逻辑bug:判断坐标差的条件没有加绝对值,只要新坐标大于原有坐标,差值为负就会满足小于5的条件,会导致跟踪匹配错误,建议修改为abs(list[i].x - x) <5 && abs(list[i].y - y) <5。
内容的提问来源于stack exchange,提问作者Guinther Kovalski
相关产品推荐
相关产品推荐

