重复调用容器上的size()(循环期间)不好?

Fra*_*ank 12 c++ optimization loops stl

出于效率原因,我总是避免编写这样的循环:

for(std::size_t i = 0; i < vec.size(); ++i) { ... }
Run Code Online (Sandbox Code Playgroud)

哪里vec是STL容器.相反,我要么

const std::size_t vec_size = vec.size();
for(std::size_t i = 0; i < vec_size; ++i) { ... }
Run Code Online (Sandbox Code Playgroud)

或使用容器迭代器.

但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次而不是线性的,因为矢量不知道它的大小而且必须反复计算.但现代编译器不会检测到这种情况并将其优化掉吗?

Mar*_*tos 10

vector::size()是恒定时间,通常实现为一个简单的内联函数,并进行优化.不要打扰手工优化它.

  • +1:我已经完成了基准测试,结果发现编译器会为这类事件发出**相同的**代码(因为这篇文章中有一个参数:http://stackoverflow.com/questions/535223/why -cant-I-推此-对象到-MY-stdlist/535233#535233).标准规定size()是一个`const`函数.所以只要你只在循环中使用`const`操作,就可以知道它只需要调用一次.通过观察组件,它确实如此. (4认同)

Bil*_*eal 9

我记得在Meyers中读到它将是二次而不是线性的,因为矢量不知道它的大小而且必须反复计算.

你要vectorlist困惑.vector的大小值保存在向量中; list要求横向实际列表.

  • @Steve:因为`std :: list :: splice`需要是常量时间,并且必须使用任意迭代器.你必须横向列表以获得那里的距离,这将使它成为线性时间,而不是常数. (4认同)
  • 在上面编辑:`splice`不是*要求*是恒定时间,但它*可能是*.如果`splice`**被实现为恒定时间,则`size`不能.如果`size`被实现为常量,则`splice`不能.选择哪个取决于您对STL的特定实现. (4认同)