Зачем нужна динамическая память

188
03 ноября 2019, 22:00

Раньше я думал что динамическая память нужна для того чтобы выделять там память под массивы типов, размер которых не известен во время компиляции. Сейчас я узнал, что в стандарте С++ нет VLA (хотя с настройками компилятора clang, VLA можно осуществить), зато в Си VLA есть. Так зачем вообще тогда нужна динамическая память, если можно включить VLA. Единственное мое предположение, это то что размер стека ограничен много меньшим числом, нежели размер кучи, поэтому большой размер памяти аллоцируем в куче.

Answer 1
  • Динамическая память нужна в первую очередь для того, чтобы дать пользователю ручной контроль над временем жизни/продолжительностью хранения создаваемых объектов. То есть выражаясь попросту для того, чтобы можно было выделить память внутри блока (функции), выйти из этого блока (функции), а память при этом оставалась выделенной.

    Это главное назначение динамической памяти - реализовывать динамическую продолжительность хранения, т.е. существовать "вечно": пока память не будет освобождена явной командой освобождения памяти. Такой ручной контроль над временем жизни может использоваться как для продления этого времени, так и для его сокращения.

    Никакие VLA вам в этом не помогут. VLA - локальные автоматические объекты, время жизни которых подчиняется правилам для локальных автоматических объектов.

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

  • Вторым по значимости назначением динамической памяти уже является создание объектов, чей тип известен только во время выполнения: полиморфные объекты или массивы заранее не известного размера.

  • И, наконец, в качестве третьего, побочного, назначения динамической памяти можно назвать создание объектов, чье время жизни является вполне автоматическим, но которые при этом слишком велики для автоматической памяти (для размещения в стеке).

READ ALSO
Как подойти к решению такой задачи? [закрыт]

Как подойти к решению такой задачи? [закрыт]

Напишите функцию, которая принимает на вход два числа, и возвращает сумму всех чисел между ними, которые делятся на 5 или на одно из этих...

174
Свой header(.h) и компиляция нескольких файлов [закрыт]

Свой header(.h) и компиляция нескольких файлов [закрыт]

Я разделил свою программу на три файлаВсе они находятся в одной папке и запускаются в компиляторе g++ как g++ main

179
MySQl BIND ip c++

MySQl BIND ip c++

как сделать бинд в mysql connector c++?

181
Разворто стека (дно сделать вершиной и наоборот) [закрыт]

Разворто стека (дно сделать вершиной и наоборот) [закрыт]

Не работает почему-тоХотел поменять 0 элемент с -1, 1 с -2, 2 с -3 и т

147