Как конструктор по умолчанию знает, где инициализировать значения по умолчанию элемента данных в памяти

Из книги "Первый скрытый аргумент конструктора - это указатель this." Теперь, когда мы пишем как

classname object;

Это похоже на создание первой памяти для объекта, а адрес объекта передается конструктору по умолчанию, чтобы он мог инициализировать значения класса.

Если это концепция объекта, как создается память, создается ли она ОС?

В C++ действует правило «как если бы», что означает, что вы не можете точно сказать, как оно работает. Это «как будто» создается память для объекта, а затем адрес передается конструктору, но невозможно сказать, действительно ли ваша программа работает таким образом. Так что подумайте об этом так, если это поможет, но в действительности все может быть иначе.

john 18.12.2018 12:40

Кстати, что это за книга?

john 18.12.2018 12:49

Мышление на C++

Nimay Das 18.12.2018 13:36

Это хорошая книга (бесплатно), посмотрите главу 1 «Создание и уничтожение объектов».

john 18.12.2018 14:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
98
3

Ответы 3

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

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

john 18.12.2018 12:46

Как Джон упомянул в комментариях, в Стандарте нет явной информации о том, как выделяется / управляется память. Однако, если предположить, что никакая оптимизация компилятора не выполняется и вы создаете объект в стеке ... тогда произойдет вероятно.

Данный:

void f()
{
    foo x;
}

Компилятор выдаст что-то вроде:

void f()
{
    char foo_buffer[sizeof(foo)];
    new (&foo_buffer) foo()
    reinterpret_cast<foo*>(foo_buffer)->~foo();
}

Пространство для экземпляра foo резервируется в стеке, затем в этом пространстве вызывается конструктор. В конце области вызывается деструктор.

Это зависит от того, где вы пишете свое определение:

  • Если вы определите свой объект в глобальной области видимости, компоновщик определит, где разместить объект в области данных программы, и убедится, что там достаточно места. То же самое верно для всех статических объектов, независимо от того, являются ли они статическими членами класса или функцией локальной статики.
  • Если вы определяете свой объект как локальный объект в функции, он будет помещен в стек. Соглашения о вызовах в используемой системе предусматривают достаточно места в стеке (при условии, что в стеке достаточно места для начала; в противном случае вы получите переполнение стека).
  • Если ваше определение на самом деле является объявлением члена, пространство для объекта будет создано в содержащем объекте, и новый объект будет помещен туда.
  • Для полноты картины при использовании выражения new пространство выделяется в куче, и объект размещается там.
  • Другой случай - это локальные объекты потока, которые размещаются где-то в стеке потока.

Обратите внимание, что размещение объектов применяется ко всем конструкторам: единственное значение конструктора по умолчанию состоит в том, что вы не передаете никаких аргументов при создании объекта.

Другие вопросы по теме