【发布时间】:2017-09-16 08:51:38
【问题描述】:
我想知道指向对象的 std::vector 与使用直接包含对象的 std::vector 相比如何影响程序的性能。具体来说,我指的是程序的速度。
我被教导要使用 std::vector 而不是其他 STL,例如 std::list 以提高速度,因为它的所有数据都连续存储在内存中,而不是碎片化。这意味着迭代元素很快,但是我的想法是,如果我的向量包含指向对象的指针,那么对象仍然可以存储在内存中的任何位置,并且只有指针连续存储。我想知道在迭代向量和访问对象时这将如何影响程序的性能。
我当前的项目设计使用指针向量,以便我可以利用虚函数,但是我不确定这是否值得我的向量变得非常大时可能遇到的速度损失。感谢您的帮助!
【问题讨论】:
-
如果对象是多态的,你必须使用指针。如果将其设为对象向量,则在将它们存储到向量中时会对它们进行切片。如果你需要维护对象的身份,你会失去对象向量,因为它会复制。
-
指针是连续存储的。指针引用的数据是Crom-knows-where。确定这是否是性能问题的唯一方法是分析这两个选项。但在您开始执行此操作之前,当前版本是否符合所需的性能规范?有什么需要改进的地方吗?
-
我怀疑这是否是您减速的原因。
-
通过分析器运行你的程序,看看哪一段代码占用了你的时间,然后寻找并消除那段代码中的低效率。如果事实证明这就是您存储数据的方式,那就这样吧,但在做出决定时没有什么比硬数字更重要的了。破解代码是因为你有一种感觉……我猜对绝地有用。 Meesa no Jedi,好吗?看看使用 valgrind 或 Visual Studio 中内置的任何东西。如果你有所有可用的,gprof 总比没有好。
标签: c++ performance pointers vector stl