Easyelectronics.ru

Электроника для всех
Текущее время: 23 апр 2019, 23:15

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 22:02 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 90
Зачем в Си может потребоваться динамическое выделение памяти, если программа пишется для MCU ?
Иные товарищи говорят "что бы оптимальнее использовать память". Но это общее "за всё хорошее, против всего плохого".

Давайте посмотрим, какие преимущества у динамического массива перед статическим. Ведь говоря о динамическом распределении памяти мы говорим именно о динамическом массиве, иначе какой толк - динамически выделить память под одну переменную и хранить на нее ссылку? Динамический массив может расширяться и сжиматься, а статический - нет. И, типа, если у нас мало неких объектов (точнее их предтечей - структурных переменных), то мы можем использовать мало памяти, если много - то сможем расширить массив. И если 90% времени наш массив занимает 10% памяти контролера, а 10% времени - 90% памяти, то в среднем массив будет занимать 18% памяти. Круто?

Но смотрите. Если массив объектов у нас - один-единственный, а все остальные переменные - статические, то они или влезут в оставшиеся 10% физической памяти при пиковой нагрузке или не влезут. И если не влезут - беда-беда. А если влезут, то какая разница, заняты ли оставшиеся 90% памяти 10% времени или 100% времени?

Если у нас массивов объектов два (и более), то динамические массивы могу дать выигрыш, если сумма максимальных размеров массивов больше 100% памяти MCU, но средняя сумма размеров массивов никогда не превысит 100% (и чем больше эта разница, тем эффективней использовать динамическое распределение памяти). Т.е. если данные о неких сущностях занимают, скажем, 60% памяти и при этом как-бы "перетекают" из массива в массив.

Может ли кто-нибудь предложить красивый кейс/задачу в которой данные ведут себя подобным образом?

P.S. Да, динамические массивы могут быть эффективны в случае наличия чего-то вроде файла подкачки (90% времени используем оперативную память, 10% - расширяемся в файл подкачки и теряем в скорости). Но!
1. В качестве вместилища файла подкачки флеш-память (а мы подразумеваем ее, говоря об MCU) не очень подходит. Постоянные перезаписи, знаете ли...
2. Говоря об MCU мы зачастую понимаем около-реалтаймовские задачи. А там вот-это-вот-всё "память кончилась, раскручиваю блины, ща-ща-ща, еще чуть-чуть", знаете ли...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 22:06 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4002
Откуда: Кемеровская область, Киселевск
Динамический массив использует рационально доступную память, но нагружает процессор.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 22:09 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
С динамическим выделением памяти работают РТОС (операционки). Но выбают и статические режимы. Создавая процесс (задачу, очередь), они запрашивают память для своего стека и блока контроля и описания. Процессы могут удаляться, освобождая память. Насколько хорошо они это делают - зависит от используемой модели памяти и операционки. Есть такие модели, которые не допускают фрагментации и утечки памяти, перераспределяя занятые области.
При создании очередного процесса в операционке, памяти может не хватить. Это тоже нормально, если программист накосячил или память "утекла". Потому, каждый раз, выделяя память динамически, надо проверять возвращаемый указатель, что память действительно выделилась.
Память берется из кучи - пространства адресов, выделенного ручками программиста.

И простите, какой еще файл подкачки на флеше у микроконтроллера? Может я вас как-то не так понял, а может вы неверно информированы, но для расширения памяти микроконтроллера обычно есть внешняя ОЗУ, именно ОЗУ (если контроллер имеет возможность такую). Внешняя ОЗУ - либо статическая с максимальным, почти системным быстродействием, либо SDRAM, со сниженным в 2-6-15 раз быстродействием, но зато с объемом в несколько мегабайт. Например 16 Мегабайт ОЗУ - вовсе не дикость для вполне среднего микроконтроллера с собственной внутренней ОЗУ 256-320 кБайт. SDRAM выдерживает миллиарды перезаписей, это ведь конденсаторы. Да, она медленнее, из-за сниженной частоты и задержек выборки строки-столбца. Но данные с нее можно кэшировать пакетным способом во внутреннюю ОЗУ. К тому же, сами микроконтроллеры могут иметь собственный кэш данных.
Еще есть промежуточные гибриды типа PSRAM, работающие по статическому интерфейсу, но внутри с динамической структурой. Еще есть статическая ОЗУ на SPI, медленная конечно.
Чисто статическая память очень дорогая, особенно больших объемов. Синхронная динамическая гораздо дешевле и емкостнее.
А в качестве "файла подкачки" никакие флеши, извините, никто здравомыслящий ставить не будет.
Внешняя флеш, если на то пошло, используется для ROM - read-only расширения. С нее читаются крупные таблицы данных.
А еще есть NAND, она выдерживает довольно много перезаписей и используется для долговременного хранения полученных данных. Одна из самых распространенных - гигабитная Самсунг K9F1


Последний раз редактировалось BusMaster 26 июл 2017, 22:48, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 22:45 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4002
Откуда: Кемеровская область, Киселевск
Операционная система может работать без динамической памяти.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 22:50 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Может, конечно может. Есть статичные модели.
Динамчески можно выделять память во внешней ОЗУ, потому что она используется как "перевалочная база". И даже не имея операционки на борту. А можно и не выделять, можно руками контролировать. Главное, не запортить ничего.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:09 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
Арсений, всё очень просто: раз вы задаёте такой вопрос - вам оно не нужно.
Когда понадобится - останется лишь вопрос "использовать malloc или свои велосипеды".

Навскидку кейсы, где могло бы понадобиться:
1. N разных режимов в проге, каждому нужны свои данные для работы. При переходе в другой режим - 90% данных больше не требуется.
2. Есть несколько разнородных источников (или потребителей) данных, объём буфера для каждого трудно предсказуем (или же просто используются не все одновременно)
3. Хранение в памяти всякой развесистой хрени сложной структуры (представьте, к примеру, дерево файловой системы).

Да, шанс, что для любого из кейсов вы на мк предпочтёте велосипед (например, для 1 использовать union из N структур, а для 3 - массив с какими-то элементами, представляющими узлы) - весьма велик. Код сложнее, но контроля больше.

Кстати, если у вас есть "файл подкачки" - это как раз соблазн отказаться от динамического выделения в программе. Ну, выделили вы N статических массивов, но неиспользуемые просто ушли в "файл подкачки".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:20 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
...а вот теперь как их перенести в так называемый "файл подкачки" - и подумайте. Особенно когда это будут массивы разной длины, и заранее неизвестно, какой из массивов "не нужен", а какой надо оттуда "достать".
И Особенно если этот "файл подкачки" по предложению топикстартера - всего лишь флеш, с десятью тысячами циклов перезаписи. Сосчитайте, через сколько часов они выгребутся. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:36 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
С условно динамическим выделением сталкиваюсь в ситуации, когда разным подсистемам иногда требуется огромный буфер (около половины всей памяти МК). Например - принять из компа блок данных, обработать и освободить буфер, намерять кучу значений АЦП, вычислить характеристики и освободить буфер, перепаковать данные для сохранения во флеш и т.д.
Понятное дело, одновременно на этот буфер не претендуют, но в одном случае это три массива структур, в другом - массив uint8_t, в третьем - два массива.
Выкрутился выделением статической области памяти и игрой с указателями на куски этого массива.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:45 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 90
Oxford писал(а):
Динамический массив использует рационально доступную память, но нагружает процессор.

А еще может вызвать утечку, фрагментацию, рак, СПИД, бесплодие. Да и по поводу рационального использования - сомнения.

BusMaster писал(а):
какой еще файл подкачки на флеше у микроконтроллера?

В том и дело, что - никакой. :)

BusMaster писал(а):
С динамическим выделением памяти работают РТОС

Уточню. Вопрос не о методах использования, а о задачах, для которых данные методы адекватны. То, что динамическое выделение используют некоторые РТОС - это вопрос метода. Вот есть задачи для которых хорошо бы динамически выделять память, и ОС нам в этом поможет. Вопрос, что за задачи?

Декларируется, что динамическое распределение памяти может эффективней использовать физическую память.

Эффективней, значит - когда мы используем статику и памяти не хватает, мы берем MCU подороже и всё прекрасно работает, а вот еслиб использовали динамику - всё прекрасно работало бы и на дешевом MCU.

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

aamonster писал(а):
Навскидку кейсы, где могло бы понадобиться:
1. N разных режимов в проге, каждому нужны свои данные для работы. При переходе в другой режим - 90% данных больше не требуется.
2. Есть несколько разнородных источников (или потребителей) данных, объём буфера для каждого трудно предсказуем (или же просто используются не все одновременно)
3. Хранение в памяти всякой развесистой хрени сложной структуры (представьте, к примеру, дерево файловой системы).

Большое спасибо за кейсы, ув.aamonster.

1. Для режимов я бы наверное использовал N функций. Внутри каждой - статика. Обмен - или через main или через глобальные переменные.
2. Раз объем каждого буфера труднопредсказуем, то суммарный объем может легко вылезти из кучи (чоуж, может и индивидуальный вылезти). Но мы же не задаемся целью сделать заведомо неработоспособную систему. :) Вот и интересует задача, в которой средняя сумма объемов всех буферов будет фиксирована и сумма максимальных объемов буферов будет сильно больше средней суммы.
Напоминает какой-то мост/конвертор с FIFO на входе и выходе.
3. Да, для древовидных структур динамика может быть весьма наглядным паттерном разработки. Но можно воспользоваться и аналогией из СУБД. Завести статический массив (таблицу) с колонками
ID/parentID/всё_остальное.

В целом, суть моих сомнений: на самом деле не бывает массива непредсказуемо большого объема. Массив не может быть больше физической памяти MCU ;)


Последний раз редактировалось Арсений 26 июл 2017, 23:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:50 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Еще один пример динамического выделения памяти. Уж извините, я на примере операционки с динамической моделью.
Запускается МК, запускается операционка, и создается процесс, даже несколько, которые выполняют первоначальную загрузку под управлением операционки. Под каждый процесс выделяется динамически память из кучи. Затем, когда все операции выполнены, создаются новые процессы, а ненужные более старые - удаляются. При этом, если используется соответствующая модель управления памятью, память, выделенная под процессы, освобождается, как ненужная более для удаленных процессов. Освобожденная память может использоваться любым ресурсом далее.
Каждый созданный процесс отжирает на себя нехило так памяти. И если процесс вообще не нужен, то логичнее его как бы и удалить, а память - осбоводить.

И эта... Ребята, прежде чем спорить о хорошести или плохости динамического или статического выделения - вы бы сами то попробовали бы, ась? тогда и споры бы отпали, и все эти ваши рассуждения о файлах подкачки обрели бы ясный смысл. А то так - че блин толку рассуждать о том, чего вы никогда не пробовали?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:56 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
BusMaster, "возникает соблазн" - это не значит, что так надо делать :-), скорей наоборот.

Просто если большого адресного пространства нет - волей-неволей уместишься в маленьком. Так что если "файла подкачки" нет, необходимость динамического выделения памяти почувствуешь даже раньше, чем с ним.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 26 июл 2017, 23:59 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Арсений писал(а):
. Массив не может быть больше физической памяти MCU ;)

Та ну! Да вы чо :) Ну задайте массив как УКАЗАТЕЛЬ и тупо инкрементируйте указатель в бесконечном цикле. Он вам будет указывать на любые адреса в пределах адресного пространства, а для АРМ-совместивых это 4 гигабайта! ГИГАБАЙТА, едритмадрит! 4 гигабайта! 0xFFFF FFFF - тоже в адресном пространстве! А собственной оперативки максимум на полмегабайта, в самых старших моделях.
Ну хорошо там есть хардфаулт, блокирующий МК, когда обратились не по адресу. Но задайте указатель не в пределах ОЗУ, а на адресах ПЕРИФЕРИИ. И по указателю вы запросто запишите или прочитаете, но уже не ОЗУ.
Так что, не разглагольствуйте впустую, лучше попробуйте вживую.

Арсений писал(а):
А еще может вызвать утечку, фрагментацию,

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


Последний раз редактировалось BusMaster 27 июл 2017, 00:20, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 00:19 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1003
Откуда: Brussels
С динамической памятью в программе можно в сумме использовать больше памяти чем есть в MCU. Т.е. выделить 8 статических буферов (для разных подсистем) по 64К не помещается в память, а 8 динамических (в разное время жизни программы) - легко.

Динамический буфер можно адаптировать под текущие потребности программы и доступные на данный момент ресурсы. Держать заранее выделенные статические буферы под любой потенциальный запрос - глупость.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 00:40 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 90
//Mt писал(а):
выделить 8 статических буферов (для разных подсистем) по 64К не помещается в память, а 8 динамических (в разное время жизни программы) - легко.
Действительно, если можно прочитать только название, зачем еще читать посты под ним?
А почему вы создаете 8 статических по 64К "в одно время", а 8 динамических по 64К - "в разное время"? :)
Так можно еще 8 статических создать на STM32F030, а 8 динамических на STM32F746 с пристегнутой SDRAM )))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 00:54 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Чой-то я совсем не понимаю рассуждений топикстартера.. эх... Просто так поболать ему захотелось, чтоль?
8 по 64K на 030F4 с его 4К ОЗУ не создашь, даже в динамическом режиме. Не, ну конечно статически можно объявить 8 указателей и подумать что это типа 8 по 64К.. Но хардфаулт обеспечен. А при malloc(64*1024) вам 0 вернется.
Вы можете спокойно статически объявить указатель на выбранный вами адрес и использовать этот указатель в разное время для разных вещей и размеров. Указатель - он не ограничивает размер массива, он только указывает на его начало. Более того - два указателя могут указывать на один и тот же адрес, но использоваться в разных функциях в разное время для хранения разных данных разной длины. Главное - вручную не перехлестните использование и не попортите данные одновременным использованием одного и того же участка.
Кстати, динамически выделенный массив вы можете так же вручную испортить.

Давно бы ТС уже сам сел да попробовал вживую. Сам на своих шишках и понял бы, где есть хорошо динамическое, а где лучше статическое, а где и то, и другое.
И кстати, помимо статической и динамической, есть еще и стек. А знаете ли, что это такое, где он сидит и чего в себе держит? Ааа, во-во! между прочим, есть о чем подумать!


Последний раз редактировалось BusMaster 27 июл 2017, 01:06, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 00:57 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1003
Откуда: Brussels
Статические - они по определению в одно время. Т.к. delete статическому буферу сделать нельзя.

Т.е. если мы предполагаем что может потребоваться обрабатывать максимум 40К IP фрагментов одновременно то статический буфер нам нужен размера 40K*(maxMTU+(max_размер_служебных_данных)). maxMTU положим 9100 байт, а средний размер фрагмента байт так 200. Оверхед посчитаете? Ну и в обработке в среднем находится 4К фрагментов, 40К это очень теоритический максимум, встречающийся 1-2 раза в неделю.

Юзкейс понятен?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 01:28 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 90
//Mt писал(а):
Статические - они по определению в одно время. Т.к. delete статическому буферу сделать нельзя.

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

//Mt писал(а):
Т.е. если мы предполагаем что может потребоваться обрабатывать максимум 40К IP фрагментов одновременно то статический буфер нам нужен размера 40K*(maxMTU+(max_размер_служебных_данных)). maxMTU положим 9100 байт, а средний размер фрагмента байт так 200. Оверхед посчитаете? Ну и в обработке в среднем находится 4К фрагментов, 40К это очень теоритический максимум, встречающийся 1-2 раза в неделю.

Хороший кейс. Спасибо.
Но почему формула 40K*(maxMTU+(max_размер_служебных_данных)) ?

Эта формула дает под 400Мб статический массив. Но если ожидается средний объем 40К*200байт=8Мб, то и создаем статический массив на 8Мб под байты фрагментов + массив на 40К*2байта, тоже статический, по которому можно будет оперативно находить N-ый фрагмент. Так даже круче, чем динамическим массивом, ибо у нас получается сходу индексация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 01:44 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Индексация массива? А что, арифметику указателей уже отменили в новом чтении? Ну, не знал, не знал...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 01:51 
Старожил

Зарегистрирован: 22 июн 2010, 21:53
Сообщения: 1003
Откуда: Brussels
Арсений писал(а):
...но можно вызвать функцию, в которой объявляется статический массив. И после выхода из нее массив пхххх... растворится.

Это только при линейном исполнении алгоритма. Что чуть реже чем никогда.


Арсений писал(а):
Хороший кейс. Спасибо.
Но почему формула 40K*(maxMTU+(max_размер_служебных_данных)) ?

Эта формула дает под 400Мб статический массив. Но если ожидается средний объем 40К*200байт=8Мб, то и создаем статический массив на 8Мб под байты фрагментов + массив на 40К*2байта, тоже статический, по которому можно будет оперативно находить N-ый фрагмент. Так даже круче, чем динамическим массивом, ибо у нас получается сходу индексация.


И нам прилетает пик дополнительно 20К фрагментов по 4К т.к. где-то перестроились линки. А у нас памяти всего в системе ну 2Гб - так и кроме обработки фрагментов еще много чего делаем. Нам же может (и иногда прилетает) придти все 40К фрагментов по 9100 - но мы понимаем что это редкое событие, и под эту обработку можно запросить память из общего пула. Если вдруг (еще реже) случится так что нету там памяти (еще кто-то в этоже время взял) - пойдут задержки в обработке, дропы или отказы.

Но не можем же мы регулярно дропать трафик только потому, что неправильно оценили паттерн использования и выделели для задачи маленький буфер? Кстати у старых версией многих маршрутизаторов так и было - достаточно жесткие лимиты и даже при наличии свободной памяти у другой подсистемы, временно задействовать ее было никак. Иногда это было архитектурно оправдано, иногда совсем нет. У современных крупных коробок тоже лимиты есть - но чаще уже из-за железа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 02:54 
Заглядывает иногда

Зарегистрирован: 17 мар 2015, 16:18
Сообщения: 90
Смотрите.
Эффективное использование памяти, это когда у нас 100% времени занято 90% памяти нужными нам данными (а не машинным мусором).
Не эффективное использование памяти, это когда 99% времени используется 10% памяти, но "мы вот-вот ожидаем пика".

Предположим, у нас есть некий сервер, который должен крайне быстро обработать трафик в т.ч. при пиковой нагрузке. Могу я на этом сервере запустить рендер 3D-Max? Вряд ли, даже с учетом динамически распределяемой памяти. Да, 99% времени - пусть рендерится. Но мы-то не знаем, когда точно будет пик. Поэтому - динамика-не_динамика, а свободную память придется держать в резерве.

О чем я и написал в 3 абзаце 1 сообщения. Если у нас одна ресурсоемкая сущность, то мы или статически занимаем максимум места под возможный пик или не занимаем его динамически, но такое, якобы, "свободное" место нам тоже нельзя использовать. Ибо мы - в ожидании пика.

Добавлено.
Т.е., типа, динамика позволяет расширять массив. Но его можно расширять в случае если:
1. Достаточно физической памяти и...
2. ...эта память не занята чем-то другим.
И если мы заложились на 40К фрагментов по 200 байт в среднем и установили 10Мб физической памяти, то да! , если придет 20К дополнительных фрагментов (которые в сумме с 40К дадут 12Мб) - придется дропать в любом случае.
И даже если физической памяти хватает, но она занята другим динамическим массивом а у нас - пик для первого массива - чего делать? Дропать поток для первого или жестко, некрасиво и срочно сносить второй массив? По мне, так динамическое распределение памяти в ряде случаев - фиговый листок, прикрывающий ненадежность получившейся системы. "Мы зделали быстра и дешева"

Я чувствую, что во всей красе динамика могла бы развернуться при существовании (внутри одного вычислителя) нескольких явно указанных сущностей и одной неявной. И данный об этой неявной сущности занимали бы фиксированный объем, но непредсказуемо "переливались" бы между различными явными сущностями. Отчего одни из них "возбухали", а другие - "усыхали" бы.


Последний раз редактировалось Арсений 27 июл 2017, 11:06, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 03:24 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
Я ж говорю - не парьтесь, когда вам понадобится динамическое выделение - вы почувствуете :-), а до того оно всё равно будет казаться неестественным.

Кстати, пример //Mt хорош. Пакеты разного размера, приходят себе потихоньку, потом уходят. Добавим сюда уход пакетов не в том порядке, в котором пришли (ну там, QoS, или порт для каких-то пакетов занят, или ещё что) - и получаем задачку, в которой динамическое выделение практически неизбежно.
Правда, именно для этой задачки я бы использовал не malloc, а свой велосипед специально разработанный аллокатор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 03:37 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2985
Чето вы, ребята, ваапще не в ту степь ушли. Начали за здравие, за микроконтроллеры, а ушли в четрт знает вкуда.3дэМакс, рендерить... на микроконтроллере.. ну даёте. Вот в чем беда "неэмбеддеров", так в том, что они не понимают из чего состоит то, на чем они работают.
Арсений писал(а):
...но можно вызвать функцию, в которой объявляется статический массив. И после выхода из нее массив пхххх... растворится.

А как думаете, где она выделяется таким способом? Причем, будут различия - если объявите этот массив с квалификатором static - память под массив будет выделена в одном месте, и после выхода из функции она останется. А если без квалификатора static, то как думаете, в каком участке памяти она выделится? Что такое стек - слыхали? Аа, вот почитайте. И как думаете - вызывая штук 5 таких функций друг из друга - насколько просядет стек? В АРМ-совместимых и некоторых других МК стек расположен в той же ОЗУ и может занимать теоретически весь объем. А как думаете - рано или поздно стек может натолкнуться на внестековые выделенные участки? Думайте, думайте.
А теперь из той же функции напишем malloc(200) - как думаете, в какой области будет выделен адрес? И в виде чего он будет выделен? А где будет храниться переменная указателя, содержащая адрес выделенного массива?

Вообще, почему вы думаете, что память должна обязательно быть загружена на 100% Да ну. При около 100% загрузке вы рискуете получить отказ выделения или "пробой" стека. Стек во многих микроконтроллерах хранится в ОЗУ.
И еще. Допустим, у микроконтроллера 32 кБ ОЗУ, используется не больше 15 кБ и не будет больше, но зато у него 100 ножек и все заняты под завязку. Это неэффективное использование памяти? Прикажете ее выжечь? Ладно, есть микроконтроллер с 16 кБ ОЗУ но на 64 ножки - не хватает ножек.
И чето вы забываете, что Си никоим образом не отслеживает границы массивов. Особенно когда они выделены с помощью указателя. Вам что, слово "указатель" ни о чем не говорит разве?
Если вы пытаетесь провести параллели между PC и MCU, то нивкакую не получится - это совершенно разные системы, с разной организацией памяти и остального.
Чето эти ваши категоричные рассуждения о видах памяти напоминают рассуждения гаражного мастера дяди Васи о вкусе черной и красной икры.
Не попробовав на деле, вы все равно не поймете, как и для чего это работает.
Вобщем, какая-то категоричная тема, но пустая совершенно. Ваще ниачом, как у нас выражаются.

PS. Аа, я понял. Ясно. Это - вот что бывает, когда "неэмбеддеры" приходят в среду "эмбедда". Тогда у них и появляются файлы подкачки на флеше, да и про внешнюю ОЗУ они ниче не слышали, да и про карту памяти (распределение адресов) тоже.


Последний раз редактировалось BusMaster 27 июл 2017, 10:08, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 03:44 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 751
Связанные списки например.. Бывает очень удобно для хранения каких либо событий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 03:55 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
Кстати, вспомнил эмбеддерскую хрень, в которой есть не то что динамическое выделение памяти - garbage collector. NodeMCU.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Зачем в Си нужно динамическое выделение памяти?
СообщениеДобавлено: 27 июл 2017, 08:50 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2767
В одном из недавних проектов на STM32F4 в SDRAM было 64МБайта. И то, без динамического выделения не получалось статически сразу дать нужные объемы, только под критичные вещи, типа видеобуфера для экрана, для GUI и прочее. Память(куча) RTOS, TCP/IP, и прочее крутилось в в внешней SDRAM, менеджер памяти использовал от FreeRTOS. Сильно упрощало жизнь.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB