Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 23.09.2009, 21:05   #1 (permalink)
voipp
Member
 
Регистрация: 21.09.2009
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Динамическая память в с\с++

Насколько нежелательно часто использовать функции new malloc realloc в программах? Может ли это как-то сказываться на памяти или еще как-то?
voipp вне форума   Ответить с цитированием

Старый 23.09.2009, 21:05
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Если поискать по форуму, то можно найти много похожего, рекомендую к прочтению

Память
Оперативная память

Старый 23.09.2009, 22:09   #2 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от voipp Посмотреть сообщение
Насколько нежелательно часто использовать функции new malloc realloc в программах? Может ли это как-то сказываться на памяти или еще как-то?
Вопрос не настолько однозначный, каким кажется на первый взгляд. Одного решения точно нет.
Бывает, что без них просто невозможно обойтись - например, когда ты просто не знаешь какой объём данных нужно временно сохранить, а бывает просто становится удобнее.

В принципе, в том же C++ сплошь и рядом (особенно в библиотеках по типа C++ Builder, etc) используется похожий механизм - new/delete. В C пореже, но тоже используется - в 99.9% случаев это динамические массивы.

Опишу возможные проблемы, основные на вскидку:
1. Нехватка памяти - выделяешь больше чем доступно - ошибка, как, в принципе, и при объявлениях переменных (особенно массивов) в коде программы.
С другой стороны - если ты просто объявляешь переменную и не хватает для неё памяти - то твоя программа просто не запустится, а если выделяешь с помощью сабжевых функций - то она вылетит в момент выделения. Но всё же я бы не назвал это проблемой чисто данных функций.
2. Нужно следить, что бы память освобождалась как только больше не нужна - тут бывают проблемы, всё таки код пишут люди - а они не идеальны. Да и в теории может быть не предусмотренный сбой.
Поэтому нужно либо тщательно за собой следить и всё перепроверять, либо (что намного-намного лучше) по возможности - инкапсулировать. Если всё-таки инкапсулировать не получается - нужно стараться писать программы так, что бы выделение и освобождение памяти производились , например, в одной функции - и лучше если она будет относительно короткой и атомарной.
3. Если в программе часто происходит выделение/освобождение маленьких кусков памяти - то может возникнуть фрагментация памяти, что, в свою очередь, через некоторое время может привести к недоступности довольно больших объёмов памяти. Тут стратегия борьбы полностью зависит от ситуации.
4. Операция выделения памяти занимает время - где-то больше, где-то меньше - но в общем случае занимает и не так уж и мало. Особенно это касается realloc - т.к. если память сразу за ранее выделенным куском занята, а нужно расширить этот кусок - кусок переносится в другое место. Тут можно посоветовать, например, в случае динамических массивов, делать инкапсуляцию доступа к ячейкам (опять же тут решается проблема с выходом за пределы выделенной под массив памяти) в отдельные функции (например, set и get) или классы (если соответственно это C++).

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

P.S. Итог по личному опыту:

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

В C++ - идёт 50 на 50 - в настоящее время, особенно для больших проектов, считается что скорость проектирования главнее скорости работы приложения. А скорость проектирования это паттерны. А там зачастую не обойтись без new/delete.

P.P.S. Вот, как-то так. В принципе - вопрос довольно общий - поэтому ответ тоже)) Если интересуют конкретные области применения - то можно поговорить по ним.
csbwalker вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 16:03.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.