динамический — C ++ Конструкторы Runtime / Compile Time

Как я знаю, мы можем создавать объекты во время выполнения или во время компиляции. Например

SomeType object1;
SomeType *object2 = new SomeType;

Так что я думаю, что в коде здесь;

int main(){

cout << "lalalal";
SomeType object1;
}

Для object1 должен быть вызван конструктор, а затем на экране должно появиться lalalal. Потому что компилятор выделяет память до запуска программы. Так в какой момент я ошибаюсь?

1

Решение

Как я знаю, мы можем создавать объекты во время выполнения или во время компиляции.

На самом деле, нет. В вашем примере кода первый объект создается с автоматический продолжительность хранения (часто описывается как «в стеке»), а вторая с выделено динамический продолжительность хранения (часто описывается как «в куче»). Но оба они происходят во время выполнения.

Для object1 должен быть вызван конструктор, а затем на экране должно появиться lalalal.

Утверждения в функциях выполняются сверху вниз (очевидно, не включая циклы). Итак, объект создан вторым.*

Потому что компилятор выделяет память до запуска программы.

Да, возможно, что память выделяется раньше времени. Но насколько наблюдаемый эффекты касаются, это не имеет значения.


* Однако, поскольку вы не включили символ новой строки в строку, то, что вы может видеть — это эффект буферизации строк; во многих системах вывод не отображается, пока не будут получены символы новой строки или пока программа не завершится.

5

Другие решения

Во-первых, в C ++ есть две разные концепции: продолжительность хранения,
и время жизни объекта. И пока продолжительность хранения не может быть
короче времени жизни объекта, обратное не обязательно
правда. И во-вторых, оба являются концепциями времени выполнения, а не времени компиляции.

В этом случае, однако, нет никакой разницы. Оба
срок хранения и срок службы объекта object1 Начните
когда определение выполняется, и заканчивается, когда оно выходит из
объем. Фактически большинство компиляторов выделяют всю память
для локальных переменных в верхней части функции, но только потому, что
соответствующая программа не может сказать, что она не была
выделено по определению. Все, что влияет на
наблюдаемое поведение программы, однако, должно происходить, когда
Стандарт говорит, что это должно произойти.

1

Нет, object1 в вашем примере он не «создается» во время компиляции, он создается во время выполнения, как и другой объект. Более того, object1 «построен» после cout команда выполняется, и, следовательно, ее конструктор выполняется впоследствии. Память для этого могла бы быть выделена до этого, хотя.

0