Единственный способ предварительно выделить всю эту память сразу - реализовать собственные распределители, например, так (код не завершен, поскольку очевидно, что распределители имеют больше членов, которые необходимо поддерживать):
class my_string_allocator {
public:
char * allocate(size_type n, allocator<void>::const_pointer hint=0) {
// ... grab a chunk from your pre-allocated pool ...
}
};
typedef basic_string<char, char_traits<char>, my_string_allocator> my_string;
class my_vector_allocator {
public:
my_string * allocate(size_type n, allocator<void>::const_pointer hint=0) {
// ... similar magic goes here ...
}
}
vector<my_string, my_vector_allocator> my_string_vector(1000);
for (unsigned int ui=0; ui<1000; ui++)
my_string_vector[ui].reserve(1024); // Memory taken from pool; no allocation.
Это действительно только практично, если вы точно знаете, что выделяете на время жизни этих структур данных, поскольку более гибкое распределение потребует логики, подобной управлению кучей, в ваших распределителях.