You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:12:03