Вопрос про std::list uniform initialization
От: Максим Рогожин Россия  
Дата: 11.06.18 09:11
Оценка:
Привет!

#include <list>

class SomeClass {
public:
   SomeClass(int);
};

std::list<SomeClass> some_list{ SomeClass(1), SomeClass(2), SomeClass(3), SomeClass(4), SomeClass(5) };

int main() {
   return 0;
}


std::list для каждого нового объекта выделяет новую память (с помощью operator new) и помещает туда этот объект (и добавляет ссылки на предыдущий и следующий элементы). Но как это работает в данном случае — ведь еще не началось выполнение программы, а список some_list уже создан?
Отредактировано 11.06.2018 9:13 Максим Рогожин . Предыдущая версия .
Re: Вопрос про std::list uniform initialization
От: AeroSun  
Дата: 11.06.18 09:24
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>std::list для каждого нового объекта выделяет новую память (с помощью operator new) и помещает туда этот объект (и добавляет ссылки на предыдущий и следующий элементы). Но как это работает в данном случае — ведь еще не началось выполнение программы, а список some_list уже создан?


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

ПС: когда-то на собеседованиях разные компании баловались этим — "как выполнить какой-нибудь код до начала main?". Вот так, через конструктор глобального объекта.
Re[2]: Вопрос про std::list uniform initialization
От: Максим Рогожин Россия  
Дата: 11.06.18 09:45
Оценка:
Здравствуйте, AeroSun, Вы писали:

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


AS>ПС: когда-то на собеседованиях разные компании баловались этим — "как выполнить какой-нибудь код до начала main?". Вот так, через конструктор глобального объекта.


Спасибо! Т.е. это ничем не отличается от такого кода?
#include <list>

class SomeClass {
public:
   SomeClass(int);
};

std::list<SomeClass> some_list;

int main() {
   some_list.push_back(SomeClass(1));
   some_list.push_back(SomeClass(2));
   some_list.push_back(SomeClass(3));
   some_list.push_back(SomeClass(4));
   some_list.push_back(SomeClass(5));
   return 0;
}


Еще один вопрос про uniform initialization — объект some_list будет создан в статической памяти, а сами элементы этого some_list где будут созданы?
Отредактировано 11.06.2018 9:46 Максим Рогожин . Предыдущая версия .
Re[3]: Вопрос про std::list uniform initialization
От: AeroSun  
Дата: 11.06.18 12:01
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Спасибо! Т.е. это ничем не отличается от такого кода?

МР>
МР>#include <list>

МР>class SomeClass {
МР>public:
МР>   SomeClass(int);
МР>};

МР>std::list<SomeClass> some_list;

МР>int main() {
МР>   some_list.push_back(SomeClass(1));
МР>   some_list.push_back(SomeClass(2));
МР>   some_list.push_back(SomeClass(3));
МР>   some_list.push_back(SomeClass(4));
МР>   some_list.push_back(SomeClass(5));
МР>   return 0;
МР>}
МР>


Не совсем, в первом примере создание идёт через initializer_list. Но в целом верно — это будет абсолютно обычный объект, единственное, что доступ к some_list будет отовсюду.

МР>Еще один вопрос про uniform initialization — объект some_list будет создан в статической памяти, а сами элементы этого some_list где будут созданы?


При создании объектов будут вызваны конструкторы. В конструкторе list размещает свои элементы через new — соответственно все они будут в динамической памяти.
А к чему такой вопрос? В контексте глобальных объектов статическая память лишь логически отличается от динамической, оно не должно волновать разработчика как там компилятор отобразит глобальные объекты в памяти.
Re[3]: Вопрос про std::list uniform initialization
От: Vamp Россия  
Дата: 11.06.18 13:49
Оценка: 2 (1)
МР>Спасибо! Т.е. это ничем не отличается от такого кода?
Отличается, это так называемая динамическая инициализация. Она выполняется до вызова main. Имеет значение в контексте глобальных объектов.

МР>Еще один вопрос про uniform initialization — объект some_list будет создан в статической памяти, а сами элементы этого some_list где будут созданы?

Ты напрасно смешиваешь uniform initialization и динамическую инициализацию. Из-за этого у тебя возникает недопонимание. Uniform initialization — это просто синтаксис вызова конструктора. Элементы списка создаются в соответствии с использованным аллокатором, в данном случае в динамической памяти.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Вопрос про std::list uniform initialization
От: Максим Рогожин Россия  
Дата: 11.06.18 17:51
Оценка:
Здравствуйте, AeroSun, Вы писали:

AS>При создании объектов будут вызваны конструкторы. В конструкторе list размещает свои элементы через new — соответственно все они будут в динамической памяти.

AS>А к чему такой вопрос? В контексте глобальных объектов статическая память лишь логически отличается от динамической, оно не должно волновать разработчика как там компилятор отобразит глобальные объекты в памяти.

Вот как раз что такое статическая память мне хотелось уточнить. Т.е. это та же самая динамическая память?
Re[4]: Вопрос про std::list uniform initialization
От: Максим Рогожин Россия  
Дата: 11.06.18 18:03
Оценка:
Здравствуйте, Vamp, Вы писали:

МР>>Спасибо! Т.е. это ничем не отличается от такого кода?

V>Отличается, это так называемая динамическая инициализация. Она выполняется до вызова main. Имеет значение в контексте глобальных объектов.

А вот это динамическая или статическая инициализация?
#include <list>

std::list<int> some_list{ 1, 2, 3, 4, 5 };

int main() {
   return 0;
}
Re[5]: Вопрос про std::list uniform initialization
От: Vamp Россия  
Дата: 11.06.18 20:14
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, Vamp, Вы писали:


МР>А вот это динамическая или статическая инициализация?

Динамическая. Подробнее тут: https://en.cppreference.com/w/cpp/language/initialization
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Вопрос про std::list uniform initialization
От: AeroSun  
Дата: 12.06.18 13:55
Оценка: 2 (1) +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Вот как раз что такое статическая память мне хотелось уточнить. Т.е. это та же самая динамическая память?


Давай с начала.
Когда запускается процесс ему доступно определённое количество адресов оперативной памяти, тоесть ячеек памяти с индексом I в диапазоне [a, b] к которым он может обратиться. Значения a и b зависят от разрядности и ОС.

При старте процесса происходит инициализация, в ходе которой выполняются различные вещи, в том числе выделение памяти для стека (из адресного процесса выше).

Далее где-то надо разместить объекты, размер которых известен до запуска. А это все глобальные и статические объекты. Их ненужно создавать и следить за временем жизни — это всё решает за разработчика компилятор. Вот из вышеописанного адресного пространства выделяется область, куда и складываются все эти объекты.
Далее возник вопрос классификации (другими словами как ссылаться на эту область в документации). Её обозвали "статическая память".

Ещё в процессе выполнения программы программисту может потребоваться неизвестное на момент компиляции количество каких-то объектов. Ну то есть, их количество может меняться динамически. Под эти объекты программист сам выделяет память из адресного пространста выше. И сам освобождает — компилятор ему в этом не помощник.
Далее возник вопрос классификации (другими словами как ссылаться на эту область в документации). Её обозвали "динамическая память".

Как правило со статической они находятся рядом.
К примеру, допустим у нас адресное пространство [0, 100]. То статическая память — это может быть [10, 20], а динамическая — [25, 90].

Потому ответ на вопрос выше "статическая — это та же самая динамическая память?" зависит от точки зрения. С высокоуровневой точки зрения — нет, это разные виды памяти. С низкоуровневой — одно и то же, расделение чисто умозрительное (логическое).
Re[6]: Вопрос про std::list uniform initialization
От: Максим Рогожин Россия  
Дата: 12.06.18 14:41
Оценка:
Здравствуйте, AeroSun, Вы писали:

AS>Потому ответ на вопрос выше "статическая — это та же самая динамическая память?" зависит от точки зрения. С высокоуровневой точки зрения — нет, это разные виды памяти. С низкоуровневой — одно и то же, расделение чисто умозрительное (логическое).


Спасибо большое за подробный ответ!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.