Память для строки может быть или не быть в классе string
. Возможный (и возможно) класс string
будет управлять собственной памятью, имея только указатель на память, используемую для хранения данных. Пример:
struct Airlane {
String Name {
char *data; // size = 4
size_t size; // size = 4
}
int diameter; // size = 4
int weight; // size = 4
}; // size = 16
Обратите внимание, что это не обязательно фактические размеры, они, например, просто.
Также обратите внимание, что в C++ (в отличие от C), для каждого class T
, sizeof T
является константой времени компиляции, а это значит, что объекты никогда не могут иметь динамический размер. Это фактически означает: как только вам понадобятся данные динамического размера времени исполнения, должны быть внешние области памяти (w.r.t. the object). Это может означать использование стандартных контейнеров, таких как std::string
или std::vector
, или даже вручную управляемых ресурсов.
Это, в свою очередь, означает, что operator new
не обязательно должен знать динамический размер всех членов, рекурсивно, но только размер самого внешнего класса, который вы выделяете. Когда этому внешнему классу требуется больше памяти, он должен сам управлять им. Некоторый образцовый р-код:
Airline* myPlane = new Airline {
Name = {
data = new char[some-size]
...
}
...
}
Внутренние распределения выполняются удерживающими конструкторами:
Airline::Airline() : string(), ... {}
string::string() : data(new char[...] ... {}
operator new
ничего не делает, кроме как выделить память фиксированного размера, как «почва» для Airline
(см первый p-код), а затем «seed» Airline
s конструктор, который сам должен управлять своим временем жизни в этом ограниченном объеме «почвы», вызывая конструктор строк (неявно или явно), который сам делает еще один new
.
Мое предположение, не зная C++, заключается в том, что он хранит только указатель на строку, фактическое содержимое которой находится где-то в куче. –