Будет ли `std :: vector` делать то, о чем я не просил

В C ++, если я инициализирую std::vector v(100); и никогда не пытаться resize() ни reserve() это capacity() гарантированно останется неизменным все время? Я хочу убедиться, что по причинам перфорации не происходит выделение / освобождение памяти / 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.

1

Решение

Из замечаний по vector::reserve() в C ++ 11 23.3.6.3 «векторная емкость»:

Гарантируется, что во время вставок перераспределение не происходит
что случилось после звонка reserve() до того времени, когда вставка
сделает размер вектора больше, чем значение
capacity(),

5

Другие решения

Существует vector :: data (), представляющий выделенный массив. Следовательно, справедливо предположить, что любая операция над вектором, эквивалентная любой модификации в vector :: data (), не повлияет на распределение памяти.

1

Любая неконстантная операция с вектором может изменить его. Любая операция O (n) (например, push_back) над вектором может привести к перемещению базовых данных. Вы можете нажать на различные страницы на cppreference чтобы увидеть, что обозначение big-Oh для операций, которые вы намереваетесь использовать.

Вызовы size и оператор индекса должны завершиться за O (1), поэтому вектор не перераспределяет свой буфер.

0
По вопросам рекламы [email protected]