Чтобы помочь с обсуждением, вы можете рассмотреть следующие typedefs:
typedef std::vector<int> int_t; // internal vector
typedef std::vector<int_t> mid_t; // intermediate
typedef std::vector<mid_t> ext_t; // external
Стоимость роста (увеличение емкости вектора) int_t
влияет только на содержимое этого конкретного вектора и не влияет на другие элементы. Стоимость выращивания mid_t
требует копирования всех сохраненных элементов в этом векторе, то есть потребуется весь вектор int_t
, что обходится гораздо дороже. Стоимость выращивания ext_t
огромна: потребуется скопировать все элементов, уже сохраненных в контейнере.
Теперь, чтобы повысить производительность, было бы гораздо важнее получить правильный ext_t
размер (кажется, фиксированный 256 * 256 в вашем вопросе). Затем получите правильный средний размер mid_t
, чтобы дорогостоящие перераспределения были редкими.
Объем памяти, о котором вы говорите, огромен, поэтому вы можете подумать о менее стандартных способах решения вашей проблемы. Первое, что приходит на ум, это добавление и дополнительный уровень косвенности. Если вместо удержания фактических векторов вы удерживаете интеллектуальные указатели на векторах, вы можете уменьшить стоимость увеличения векторов mid_t
и ext_t
(если размер ext_t
фиксирован, просто используйте вектор mid_t
). Теперь это будет означать, что код, который использует вашу структуру данных, будет более сложным (или лучше добавить оболочку, которая заботится о косвенных ссылках). Каждый int_t
вектор будет выделен один раз в памяти и никогда не будет перемещаться ни в mid_t
, ни ext_t
перераспределениях. Стоимость перераспределения mid_t
пропорциональна количеству выделенных int_t
векторов, а не фактическому количеству вставленных целых чисел.
using std::tr1::shared_ptr; // or boost::shared_ptr
typedef std::vector<int> int_t;
typedef std::vector< shared_ptr<int_t> > mid_t;
typedef std::vector< shared_ptr<mid_t> > ext_t;
Еще одна вещь, которую вы должны принять во внимание, это то, что std::vector::clear()
не освобождает выделенное внутреннее пространство в векторе, только уничтожает содержащиеся в нем объекты и устанавливает размер равным 0. То есть вызов clear()
никогда не освободит память , Шаблон для фактического освобождения выделенной памяти в векторе:
typedef std::vector<...> myvector_type;
myvector_type myvector;
...
myvector.swap( myvector_type() ); // swap with a default constructed vector