Память для строки может или не может быть в пределах класса 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
- постоянная времени компиляции, означающая, что объекты никогда не могут иметь динамический размер.Это по сути означает: как только вам понадобятся данные динамического размера во время выполнения, должны появиться области внешней (по отношению к объекту) памяти.Это может подразумевать использование стандартных контейнеров, таких как std::string
или std::vector
, или даже ресурсов, управляемых вручную.
Это, в свою очередь, означает, что operator new
не нужно рекурсивно знать динамический размер всех членов, но только размер внешнего класса, который вы выделяете.Когда этому внешнему классу нужно больше памяти, он должен управлять им сам.Примерный p-код:
Airline* myPlane = new Airline {
Name = {
data = new char[some-size]
...
}
...
}
Внутренние выделения выполняются удерживающими конструкторами:
Airline::Airline() : string(), ... {}
string::string () : data(new char[...] ... {}
operator new
не делает ничего другого, кроме как выделение некоторой памяти фиксированного размера как "грунт "для Airline
(см. первый p-код), а затем" конструктор "Airline
семени, который сам должен управлять своим временем жизни в этом ограниченном объеме" грунта ", вызывая конструктор строки (неявно или явно), который сам делает еще один new
.