Не задумывайся о вещах. Когда вы говорите T x[N];
, вы объявляете автоматический (то есть локальный) массив. Это очень похоже на объявление T x1;
, T x2;
, ..., T xN;
. Экземпляр std::string
всегда занимает один и тот же небольшой размер в контексте объявления (например, в стеке); только память, которой он управляет (по умолчанию в бесплатном хранилище), является динамической.
Обратите внимание, что когда вы пишете std::string s("Hello");
в своем коде, строковый литерал (который передается конструктору), конечно, где-то сохраняется в двоичном файле вашей программы и загружается в память программы (обычно для чтения только сегмент данных). Так что если вам действительно нужно прочитать эти строки (в отличие, скажем, изменить их), то вы можете просто объявить массив указателей на символы и сэкономить память:
const char * strings[] = { "Hello", "World", "!" }; // just one copy in r/o memory