Я много использовал std::vector, и недавно я задал себе этот вопрос: "Как реализовано std::vector?" 
У меня было две альтернативы:
1) Связанный список, а затем делает API похожим на произвольный доступ (т.е. перегрузка operator[]).
2) Используя new, например. Foo* temp = new Foo[20]: Я считаю, что они делают что-то подобное, но затем возникает еще один вопрос. Всегда ли они выделяют максимальное хранилище (uint32_t) для предоставления произвольного доступа? (Это неэффективно с точки зрения памяти.)
Или есть что-то еще, о чем я должен знать?