Анализатор обнаружил 'std::vector', максимальный размер которого известен на этапе компиляции. При этом перед заполнением вектора не вызывался метод 'reserve'.
Пример:
void f() { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); }
В этом случае вызовы 'push_back' могут приводить к реаллокации внутреннего буфера в векторе и перемещении элементов в новую область памяти.
Чтобы уменьшить накладные расходы, можно заранее выделить буфер необходимого размера:
void testVectOK() { std::vector<int> v; v.reserve(6); v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); }
В сообщении анализатора указывается количество элементов, которое следует передать в метод 'reserve'.
В некоторых случаях анализатор не может точно вычислить размер контейнера, например, из-за того, что элементы добавляются под условием:
void f(bool half) { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); if (!half) { v.push_back(4); v.push_back(5); v.push_back(6); } }
Количество элементов в контейнере здесь варьируется от 3 до 6 в зависимости от условия. В таких случаях анализатор будет ориентироваться на максимальный размер.