什么时候连续的C ++数组真的比Java / C#ArrayLists快?

时间:2014-04-09 11:57:54

标签: c++ arrays performance stl

所以我从this isocpp entry over here偷了问题标题。

是一个连续的集合/容器比一个非连续的集合/容器更快?

  • 插入怎么样?
  • 访问元素 - 元素是POD(例如double)还是复杂对象(例如std::string
  • 是否重要?
  • 复制数组(及其内容,取决于语言)?

使用(C ++)数据结构时需要权衡。虽然std::vector很好,thing about memory layout肯定是正确的,但我认为人们真的还需要了解哪些情况并不是那么好。

注意:我自己也有一个非常明确的想法,但如果没有关闭我想在我自己提供可能的答案之前看看其他人的想法。

2 个答案:

答案 0 :(得分:0)

如果您观看完整的视频,中间会有一种基准测试,它表明在某些情况下,缓存的成本与连续但非真实的数组错失(C#/ Java中的指针数组)与存储实际元素而不是指针的真实连续std :: vector相比,可以是巨大的(使用标准C ++值语义)。

答案 1 :(得分:0)

Hans选择comment,但我认为这值得回答:

  

永远不会更快。这些虚拟机拥有智能垃圾收集器   即使必须使用指针,也要保持数据连续。许多   与C ++代码不同,曾经是shared_ptr<>指针被分配然后你   卡在对象所在的位置。你获得的唯一可能的收获   从本机代码能够绕过数组索引检查。没有   slamdunk,如果抖动可以看到它,它经常被优化掉   index永远不会超出范围。 Herb Sutter在Build的会议提醒我们   再一次,这是多么重要,跳到大约25:00 - 汉斯帕斯特20   分钟前

......似乎与what Herb shows on the slides(大约26:00 - 28:00)相矛盾。 “智能垃圾收集器,即使他们必须使用指针,他们也会保持数据连续”......真的??

  

是的,真的。赫伯跳过那个小细节,这不是热门新闻   在一个充满C ++程序员的房间:)非常简单的实现   课程。 - Hans Passant 4分钟前

注意:如果“它永远不会更快”,不会,但它对我来说仍然是一个有用且发人深省的答案。