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