# V827. Maximum size of a vector is known at compile time. Consider pre-allocating it by calling reserve(N).

Анализатор обнаружил '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 в зависимости от условия. В таких случаях анализатор будет ориентироваться на максимальный размер.