当我试图用c ++学习数组和向量时,我遇到了this。帖子中提到的“分页效应”是什么?另外,只是为了检查我自己的理解,我认为vector使用更多的时间是因为动态内存分配。我是对的吗?
其他问题:
但是vector<int> arr( 10000 )
是不是已经有足够的内存来分配10000个int?或者这样说,如果我所做的只是遍历每个元素并初始化它们,arr
是否还会增长?
答案 0 :(得分:5)
如果使用push_back(),Vector会使用动态分配,但您可以强制它使用reserve()预分配内存。
经过检查的构建(在调试库中很常见)也会检查向量操作的边界,这可能会在调试模式下降低它们的速度。发布版本应该不比原始C慢。
分页意味着在物理内存已满时将内存移出磁盘。如果你认为记忆被分页,你必须小心时机。一种常见的技术是多次运行任务并拒绝最长时间。
编辑:你应该(几乎)从不使用原始的'C'类型而不是STL来提高效率。编写STL的人都非常聪明并且非常关心性能。如果使用得当,它应该永远不会比'C'更差,而且往往更好。使用STL算法而不是你自己的han滚动循环也是如此。
答案 1 :(得分:1)
您链接的页面指出优化会消除性能差异。这意味着它很可能是由向量中的额外函数调用引起的 - 您可以放心地忽略这些因为优化器足够聪明以内联它们。
海报使用的名称是“分页效应”,但它们在矢量案例中实际指的是内存分配的成本。此外,通过尝试写入/读取该内存,他们将数组末尾的一个段拉入缓存中,可能会提高该内存区域的未来性能。
答案 2 :(得分:-1)
该代码的作者强制
array[size - 1] = 0;
访问以确保在运行代码的主要部分之前至少对数组缓冲区进行了一次访问。这样做是为了减轻使用虚拟内存交换文件的影响 - 该访问增加了主代码启动时缓冲区未被换出到页面文件的概率。如果没有这个,可能会发生第一次访问缓冲区时发生交换,这会大大增加运行时间并导致错误的测量结果。
如果缓冲区大小不大于操作系统用于寻址虚拟内存的最小内存段的大小,则只能保证这一点。
这不是C ++特有的问题。
此外,向量速度较慢,因为访问它需要两次内存访问 - 一次用于检索缓冲区地址,另一种用于实际访问内存。使用C数组,缓冲区地址已知,只需要一次访问。如果使用临时存储缓冲区地址重写带有向量的相同代码,则运行速度会快得多。