在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.
答案 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)时间内完成,因此向量不会重新分配其缓冲区。