#cpp #c
Раньше я думал что динамическая память нужна для того чтобы выделять там память под массивы типов, размер которых не известен во время компиляции. Сейчас я узнал, что в стандарте С++ нет VLA (хотя с настройками компилятора clang, VLA можно осуществить), зато в Си VLA есть. Так зачем вообще тогда нужна динамическая память, если можно включить VLA. Единственное мое предположение, это то что размер стека ограничен много меньшим числом, нежели размер кучи, поэтому большой размер памяти аллоцируем в куче.
Ответы
Ответ 1
Динамическая память нужна в первую очередь для того, чтобы дать пользователю ручной контроль над временем жизни/продолжительностью хранения создаваемых объектов. То есть выражаясь попросту для того, чтобы можно было выделить память внутри блока (функции), выйти из этого блока (функции), а память при этом оставалась выделенной. Это главное назначение динамической памяти - реализовывать динамическую продолжительность хранения, т.е. существовать "вечно": пока память не будет освобождена явной командой освобождения памяти. Такой ручной контроль над временем жизни может использоваться как для продления этого времени, так и для его сокращения. Никакие VLA вам в этом не помогут. VLA - локальные автоматические объекты, время жизни которых подчиняется правилам для локальных автоматических объектов. Именно это свойство динамической памяти позволяет вам, например, создавать списки или деревья с неизвестным на стадии компиляции количеством узлов, т.е. генерировать объекты-узлы в необходимом количестве во время выполнения программы. Вторым по значимости назначением динамической памяти уже является создание объектов, чей тип известен только во время выполнения: полиморфные объекты или массивы заранее не известного размера. И, наконец, в качестве третьего, побочного, назначения динамической памяти можно назвать создание объектов, чье время жизни является вполне автоматическим, но которые при этом слишком велики для автоматической памяти (для размещения в стеке).
Комментариев нет:
Отправить комментарий