1

C++ では、a を初期化しstd::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() の変更に相当する vector の操作は、メモリ割り当てに影響しないと想定するのが妥当です。

于 2014-01-02T07:04:25.467 に答える
0

Any non-const operation on the vector might modify it. Any O(n) operation (like push_back) on the vector may cause the underlying data to be relocated. You can click into the various pages on cppreference to see what the big-Oh notation is for the operations you intend to use.

Calls to size and the subscript operator must complete in O(1) time, and so the vector would not reallocate its buffer.

于 2014-01-02T06:57:39.660 に答える