Я ищу тип данных C++, подобный std::vector
но без издержек, связанных с динамическим изменением размеров. Размер контейнера останется постоянным за свое время жизни. Я рассмотрел использование boost::array
, однако, это не является соответствующим, потому что это требует, чтобы размер массива был известен во время компиляции, который не имеет место в моей ситуации.
Прежде чем использовать что-либо нестандартное, проверьте, действительно ли динамическое изменение размера влияет на производительность.
Совет: с vector.reserve никогда не будет никакого перераспределения массива.
Нет накладных расходов при перераспределении, если вы не перераспределяете std :: vector. Итак, либо:
std :: vector x (100)
) Я использовал шаблонный класс, основанный на идеях из auto_buffer
STLSoft (я собрал свою собственную реализацию из книги Мэтью Уилсона Imperfect C ++ вместе с некоторыми идеями из реализации STLSoft). Он выделяет массив по умолчанию в стеке (или встроен в объект класса), если он достаточно мал (на основе предоставленного вами параметра шаблона). Если ваше распределение времени выполнения больше, чем это, хранилище массива берется из кучи.
http://www.stlsoft.org/doc-1.9/classstlsoft_1_1auto__buffer.html
Итак, приятная особенность этого класса состоит в том, что для меньших небольших размеров выделение памяти практически не требуется.
Накладные расходы, вызванные возможностью динамического изменения размера std :: vector
, практически отсутствуют.
Если вам нужен массив размера во время компиляции, во многих случаях действительно будет хорошей идеей поиск чего-то более эффективного, чем std :: vector
.
Но разница между фиксированным размером времени выполнения и динамическим размером времени выполнения незначительна. std :: vector
- идеальное решение в этом случае.
Если размер массива неизвестен во время компиляции, то единственный вариант в C ++ - это динамически выделяемый массив. Вы можете использовать std :: vector
, чтобы гарантировать RAII. Как уже говорили другие, тот факт, что размер std :: vector
может быть изменен, не означает, что вы должны изменять их размер. Создайте std :: vector
правильного размера, а затем не вызывайте ничего, что могло бы изменить его размер.