В Википедии есть слов мудрости на эту тему.
Кроме того, это не решение, но может быть его частью - если вы находитесь под Windows, вы можете использовать семейство функций VirtualAlloc, которые позволяют резервировать адресное пространство без фактической фиксации страниц памяти. То есть, с точки зрения непрофессионалов, вы должны сделать что-то вроде «malloc» и сказать ему «зарезервировать 1000 МБ, но сделать только первые 10 доступных». Так что, если вы напишите больше 10 МБ, вы получите обычный сбой. Но когда приходит время расширяться, вы просто говорите: «Хорошо, дайте мне еще 10 МБ после первых». И следующие 10 МБ становятся доступными по адресу сразу после первых 10 МБ. Это похоже на изменение размера массива. Фактическое количество используемой оперативной памяти будет составлять столько, сколько вам нужно, но адреса памяти будут зарезервированы заранее, чтобы другие операции выделения памяти их не использовали.