1

在 C++ 中,如果我初始化 astd::vector v(100);并且从不尝试resize()也不尝试reserve()它,是否capacity()保证始终保持不变?我想确保出于性能原因没有内存分配/释放/重新分配/等正在发生。(是的,它会影响性能;我的函数一直被调用,它们必须快速返回)。

恢复一切:

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.
4

3 回答 3

5

vector::reserve()C++11 23.3.6.3“向量容量”中的注释:

保证在调用之后的插入过程中不会发生重新分配,reserve()直到插入会使向量的大小大于 的值 capacity()

于 2014-01-02T07:04:20.960 回答
1

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

于 2014-01-02T07:04:25.467 回答
0

向量上的任何非常量操作都可能修改它。向量上的任何 O(n) 操作(如 push_back)都可能导致底层数据被重新定位。您可以单击cppreference上的各个页面以查看您打算使用的操作的大哦符号是什么。

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

于 2014-01-02T06:57:39.660 回答