Как происходит динамическое выделение памяти в С++?

У нас есть некая переменная и массив, размер которого определяет человек. Как на самом деле происходит динамическое выделение памяти? Ведь в int у нас идет 4 байта, а в char 1 байт. Что подразумевается под динамикой?

int* size;
size = new int;
std::cout << "Размер массива:  ";
std::cin >> *size;
char* symbs;
symbs = new char[*size];
...
delete[] symbs;
delete size;
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Что подразумевается под динамикой?

Выделение памяти в куче.

Память может быть выделена:
1. на стеке - автоматическая память
2. в сегментах bss, data, rodata - статическая
3. в куче - динамическая

С точки зрения памяти - это все просто память процесса (некоторые диапазоны адресов в доступном адресном пространстве процесса). Но выделяется и освобождается она в разное время жизни процесса.

Стек выделяется при старте потока (в любом процессе есть хотя бы один поток выполнения), имеет фиксированный
размер. Освобождается стек при завершении потока. Фактически при объявлении переменной на стеке происходит просто увеличение (уменьшение) указателя стека на размер переменной, при удалении - обратный процесс. Поэтому выделение памяти на стеке очень быстрое. Переменные "живут" на стеке пока действует их область видимости, после выхода из области видимости - уничтожаются.

Статические сегменты памяти выделяются и инициализируются при загрузке исполняемого файла программы в память еще до старта любого кода программы. Сегменты предназначены для хранения статических инициализированных/не инициализированных переменных и констант. Фактически описание этих сегментов содержится в исполняемом файле и подготавливается компилятором. Загрузчик ОС, читает эти сегменты из исполняемого файла в память. Названия сегментов (bss, data, rodata) имеют смысл только для исполняемого файла, после загрузки сегментов в память есть только адреса начала сегментов и их размер (и другие свойства страниц памяти сегментов).

Куча. Память в куче выделяется по явному запросу программы (new) и уничтожается так же (delete). Не смотря на всю простоту интерфейса выделения/освобождения памяти операции эти довольно затратны (по процессорному времени) и под капотом может происходить много телодвижений, поэтому не следует выделять/освобождать память в куче на каждый int или еще хуже char. Для большинства программ эти затраты не критичны, но в некоторых случаях могут стать узким местом вашей программы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы