将`std :: vector`做任何我没有要求的事情

时间:2014-01-02 06:55:27

标签: c++ vector capacity

在C ++中,如果我初始化std::vector v(100);并且从不尝试resize()reserve(),那么capacity()是否一直保持不变?我想确保没有内存alloc / freeing / realloc / etc出于性能原因。 (是的,它会影响性能;我的函数会一直调用,而且必须快速返回)。

全部恢复:

std::vector<float> v;
// somehow, `v' is initialized to have 100 elements
void f() { // this function must return _very_ quickly
    /* do some processing, without ever calling v.resize() or v.reserve(), but
       accesing v.size() and v[i] all the time */
    /* it is guaranteed that no system calls (such as memory management)
       will take place here? */
} // no objects on the stack whose destroyers might try to `delete' anything.

3 个答案:

答案 0 :(得分:5)

来自C ++ 11中对vector::reserve()的评论23.3.6.3“向量容量”:

  

保证在插入期间不会重新分配   这是在调用reserve()之后发生的,直到插入时为止   会使向量的大小大于值的大小   capacity()

答案 1 :(得分:1)

有vector :: data()公开分配的数组。因此可以假设对向量的任何操作等同于对vector :: data()的任何修改都不会影响内存分配。

答案 2 :(得分:0)

向量上的任何非const操作都可能会修改它。向量上的任何O(n)操作(如push_back)都可能导致基础数据被重定位。您可以点击cppreference上的各个页面,查看您打算使用的操作的重要信息。

调用size和下标运算符必须在O(1)时间内完成,因此向量不会重新分配其缓冲区。