std::list для каждого нового объекта выделяет новую память (с помощью operator new) и помещает туда этот объект (и добавляет ссылки на предыдущий и следующий элементы). Но как это работает в данном случае — ведь еще не началось выполнение программы, а список some_list уже создан?
Здравствуйте, Максим Рогожин, Вы писали:
МР>std::list для каждого нового объекта выделяет новую память (с помощью operator new) и помещает туда этот объект (и добавляет ссылки на предыдущий и следующий элементы). Но как это работает в данном случае — ведь еще не началось выполнение программы, а список some_list уже создан?
Вообще-то выполнение программы уже началось, не запустился только основной поток выполнения. Перед его запуском происходит инициализация, вот в процессе инициализации и создаются глобальные объекты.
ПС: когда-то на собеседованиях разные компании баловались этим — "как выполнить какой-нибудь код до начала main?". Вот так, через конструктор глобального объекта.
Re[2]: Вопрос про std::list uniform initialization
Здравствуйте, AeroSun, Вы писали:
AS>Вообще-то выполнение программы уже началось, не запустился только основной поток выполнения. Перед его запуском происходит инициализация, вот в процессе инициализации и создаются глобальные объекты.
AS>ПС: когда-то на собеседованиях разные компании баловались этим — "как выполнить какой-нибудь код до начала main?". Вот так, через конструктор глобального объекта.
Спасибо! Т.е. это ничем не отличается от такого кода?
Не совсем, в первом примере создание идёт через initializer_list. Но в целом верно — это будет абсолютно обычный объект, единственное, что доступ к some_list будет отовсюду.
МР>Еще один вопрос про uniform initialization — объект some_list будет создан в статической памяти, а сами элементы этого some_list где будут созданы?
При создании объектов будут вызваны конструкторы. В конструкторе list размещает свои элементы через new — соответственно все они будут в динамической памяти.
А к чему такой вопрос? В контексте глобальных объектов статическая память лишь логически отличается от динамической, оно не должно волновать разработчика как там компилятор отобразит глобальные объекты в памяти.
Re[3]: Вопрос про std::list uniform initialization
МР>Спасибо! Т.е. это ничем не отличается от такого кода?
Отличается, это так называемая динамическая инициализация. Она выполняется до вызова main. Имеет значение в контексте глобальных объектов.
МР>Еще один вопрос про uniform initialization — объект some_list будет создан в статической памяти, а сами элементы этого some_list где будут созданы?
Ты напрасно смешиваешь uniform initialization и динамическую инициализацию. Из-за этого у тебя возникает недопонимание. Uniform initialization — это просто синтаксис вызова конструктора. Элементы списка создаются в соответствии с использованным аллокатором, в данном случае в динамической памяти.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Вопрос про std::list uniform initialization
Здравствуйте, AeroSun, Вы писали:
AS>При создании объектов будут вызваны конструкторы. В конструкторе list размещает свои элементы через new — соответственно все они будут в динамической памяти. AS>А к чему такой вопрос? В контексте глобальных объектов статическая память лишь логически отличается от динамической, оно не должно волновать разработчика как там компилятор отобразит глобальные объекты в памяти.
Вот как раз что такое статическая память мне хотелось уточнить. Т.е. это та же самая динамическая память?
Re[4]: Вопрос про std::list uniform initialization
Здравствуйте, Vamp, Вы писали:
МР>>Спасибо! Т.е. это ничем не отличается от такого кода? V>Отличается, это так называемая динамическая инициализация. Она выполняется до вызова main. Имеет значение в контексте глобальных объектов.
А вот это динамическая или статическая инициализация?
Здравствуйте, Максим Рогожин, Вы писали:
МР>Вот как раз что такое статическая память мне хотелось уточнить. Т.е. это та же самая динамическая память?
Давай с начала.
Когда запускается процесс ему доступно определённое количество адресов оперативной памяти, тоесть ячеек памяти с индексом I в диапазоне [a, b] к которым он может обратиться. Значения a и b зависят от разрядности и ОС.
При старте процесса происходит инициализация, в ходе которой выполняются различные вещи, в том числе выделение памяти для стека (из адресного процесса выше).
Далее где-то надо разместить объекты, размер которых известен до запуска. А это все глобальные и статические объекты. Их ненужно создавать и следить за временем жизни — это всё решает за разработчика компилятор. Вот из вышеописанного адресного пространства выделяется область, куда и складываются все эти объекты.
Далее возник вопрос классификации (другими словами как ссылаться на эту область в документации). Её обозвали "статическая память".
Ещё в процессе выполнения программы программисту может потребоваться неизвестное на момент компиляции количество каких-то объектов. Ну то есть, их количество может меняться динамически. Под эти объекты программист сам выделяет память из адресного пространста выше. И сам освобождает — компилятор ему в этом не помощник.
Далее возник вопрос классификации (другими словами как ссылаться на эту область в документации). Её обозвали "динамическая память".
Как правило со статической они находятся рядом.
К примеру, допустим у нас адресное пространство [0, 100]. То статическая память — это может быть [10, 20], а динамическая — [25, 90].
Потому ответ на вопрос выше "статическая — это та же самая динамическая память?" зависит от точки зрения. С высокоуровневой точки зрения — нет, это разные виды памяти. С низкоуровневой — одно и то же, расделение чисто умозрительное (логическое).
Re[6]: Вопрос про std::list uniform initialization
Здравствуйте, AeroSun, Вы писали:
AS>Потому ответ на вопрос выше "статическая — это та же самая динамическая память?" зависит от точки зрения. С высокоуровневой точки зрения — нет, это разные виды памяти. С низкоуровневой — одно и то же, расделение чисто умозрительное (логическое).