Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование операторов new и delete в embedded
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
_Макс
Слышал мнение, что использовать new и delete в embedded системах не желательно. Так ли это? С чем это связано? Как можно поступить иначе?
kurtis
Действительно ли у вас есть такая необходимость в использовании динамически выделяемой памяти? Использовать то можно, только нужно смотреть по ресурсам, если у вас 32 мегабайта ОЗУ, то используйте, проблем никаких нет, а если 4 килобайта, то тут уже нужно думать или искать какой-то custom memory allocator.
aaarrr
Использование динамического выделения памяти неизбежно влечет за собой ряд проблем - оверхед, фрагментация. Но embedded-система - это весьма растяжимое понятие, надо взвешивать все за и против в конкретном случае.
_Макс
Да собственно ресурсов то Cortex-M3, нужен канал FIFO глубиной до 500 байт. В функциях push и pop по привычке от PC программирования использовал new и delete. Код (субъективно) показался большим, но того хуже, при статическом вызове push (соответственно new внутри) порядка 30 раз программа отказывается выполняться. В отладчике будто она работает, останавливаю, в дизасемблере функции связанные с new и delete. Неужели нельзя сделать 30 вызовов new по три байта?
aaarrr
Цитата(_Макс @ Jun 15 2010, 13:09) *
Неужели нельзя сделать 30 вызовов new по три байта?

Вот это как раз хороший пример, как не надо использовать выделение памяти в системе, где этой памяти ограниченное количество. При выделении трех байт получите огромный оверхед по реальному расходу памяти.
_Макс
Цитата(aaarrr @ Jun 15 2010, 12:14) *
Вот это как раз хороший пример, как не надо использовать выделение памяти в системе, где этой памяти ограниченное количество. При выделении трех байт получите огромный оверхед по реальному расходу памяти.

За счет чего получается оверхед? Сколько % он составляет по сравнению с чистой выделенной памятью?
aaarrr
Цитата(_Макс @ Jun 15 2010, 13:17) *
За счет чего получается оверхед?

За счет структур менеджера кучи.

Цитата(_Макс @ Jun 15 2010, 13:17) *
Сколько % он составляет по сравнению с чистой выделенной памятью?

В случае трех байт, пожалуй, более 200%. Точно можно сказать только зная внутренности менеджера.
MrYuran
Цитата(_Макс @ Jun 15 2010, 13:09) *
Да собственно ресурсов то Cortex-M3, нужен канал FIFO глубиной до 500 байт.

Ну так и забейте статический буфер 500 байт под свою очередь.
Dima_G
Еще один из минусов - нереентерабельность операций new/delete (как впрочем и malloc, free smile.gif )
Да и ИМХО - любая система, динамически аллоцирующая память, должна обрабатывать возможность ее невыделения. Как в этом случае должна будет поступить embedded система, чтоб разработчику не было стыдно? )))
_Макс
Переписал push и pop, было:
Код
9 030 bytes of readonly  code memory
    72 bytes of readonly  data memory
2 086 bytes of readwrite data memory

Cтало с буфером 300 байт, без единиого иного new:
Код
8 926 bytes of readonly  code memory
   128 bytes of readonly  data memory
1 862 bytes of readwrite data memory

Без особых улучшений, но работает теперь стабильно.
MrYuran
Цитата(_Макс @ Jun 15 2010, 14:38) *
Без особых улучшений, но работает теперь стабильно.

Статическая компоновка всегда более стабильная, чем динамическая.
В крайнем случае, ошибки вывалятся на этапе компиляции, а не в работе.

Что значит "без особых улучшений"?
Во втором случае уже размещённый буфер занимает места меньше, чем в первом ещё не размещенный
_Макс
Сэкономил 200 байт RAM и 100 байт ROM smile.gif
Если new вызвано статически разве компилятор не выделит место сразу?
jorikdima
Цитата(_Макс @ Jun 15 2010, 15:48) *
Если new вызвано статически разве компилятор не выделит место сразу?

нет конечно. на то она и динамическая память.
И вообще говоря, компилятор в случае динамической памяти ничего не выделяет. Он лишь функции malloc free вызывает. Готов быть поправленым, если неправ.
Сергей Борщ
Цитата(_Макс @ Jun 15 2010, 14:48) *
Сэкономил 200 байт RAM и 100 байт ROM smile.gif
Значит где-то еще new осталось. Менеджер кучи в 100 байт ну никак не уместится.
Цитата(_Макс @ Jun 15 2010, 14:48) *
Если new вызвано статически
Это как? "Ппереведи!"
_Макс
Цитата(Сергей Борщ @ Jun 15 2010, 15:06) *
Значит где-то еще new осталось. Менеджер кучи в 100 байт ну никак не уместится.
Это как? "Ппереведи!"

Точно new больше нету, искал по исходнику.
Я имел в виду например new int, на этапе компиляции известно о том сколько нужно выделить, значит это можно сделать заранее. Хотя сколько раз такой блок будет вызван неизвестно, только если это не конструктор...
Сергей Борщ
Цитата(_Макс @ Jun 15 2010, 15:19) *
Точно new больше нету, искал по исходнику.
Искать надо в .map Возможно, new или malloc использует какая-то из библиотечных функций.
Цитата(_Макс @ Jun 15 2010, 15:19) *
Хотя сколько раз такой блок будет вызван неизвестно, только если это не конструктор...
Вот именно. И даже если конструктор - может быть создано несколько таких объектов. Часть статически, часть автоматически (локально), часть динамически.
sigmaN
Так, для информации http://www.ibm.com/developerworks/ru/edu/a...&S_CMP=GR01
Dima_G
Цитата(sigmaN @ Jun 15 2010, 22:42) *

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

https://www.ibm.com/developerworks/ru/edu/a...r/section2.html
Цитата
Такие функции, как malloc и new, являются выделителями памяти общего назначения. Ваша программа может быть однопоточной, однако, функцию malloc лучше использовать для многопоточных примеров. Дополнительная функциональность снижает производительность этой команды.


https://www.ibm.com/developerworks/ru/edu/a...r/section5.html
Цитата
Каждое выполнение данного цикла вызывает 1000 выделений и перераспределений памяти. 5000 итераций цикла приводят к 10 миллионам переключений между кодом пользователя и кодом ядра. Компиляция данного теста при помощи gcc-3.4.6 на компьютере под управлением Solaris 10 заняла в среднем 3,5 секунды. Это базовый показатель производительности при использовании глобальных операторов new и delete и стандартного компилятора. Чтобы создать специальный диспетчер памяти для класса Complex, который оптимизирует компиляцию, вам необходимо переопределить Complex при помощи операторов new и delete, относящихся к данному классу.
sigmaN
А сам я не читал её..так, просмотрел когда-то и в закладки засунул. Типа может пригодиться.
Ну переводчики как обычно жгут, что и говорить.
_Макс
Цитата(Сергей Борщ @ Jun 15 2010, 16:09) *
Искать надо в .map Возможно, new или malloc использует какая-то из библиотечных функций.

Только __data_Aldata 8 байт и free 132 байта.
XVR
Цитата(_Макс @ Jun 15 2010, 13:09) *
В функциях push и pop по привычке от PC программирования использовал new и delete.
...
Неужели нельзя сделать 30 вызовов new по три байта?
Вызывать new на 3 байта НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЕТСЯ даже на РС (если только вы не индус)
_Макс
Цитата(XVR @ Jun 16 2010, 10:35) *
Вызывать new на 3 байта НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЕТСЯ даже на РС (если только вы не индус)

Почему?
skripach
Цитата
Почему?

Написано выше, читайте. Поинтересуйтесь как работает манагер памяти и всё поймёте.
demiurg_spb
Потому что блоки, выделяемые менеджером, обычно много крупнее этих 3 байт и плюс накладные расходы на это немалые...
Хотя если всё это Вас не тревожит и морально-эстетическая сторона вопроса не Ваш конёк, то...
_Макс
Цитата(demiurg_spb @ Jun 16 2010, 12:24) *
Потому что блоки, выделяемые менеджером, обычно много крупнее этих 3 байт и плюс накладные расходы на это немалые...
Хотя если всё это Вас не тревожит и морально-эстетическая сторона вопроса не Ваш конёк, то...

Как можно узнать размер блоков и регулировать работу менеджера?
XVR
Цитата(_Макс @ Jun 16 2010, 13:30) *
Как можно узнать размер блоков
Размер блока (обычно) не менее 2х указателей (на платформе), а может быть и больше
Цитата
и регулировать работу менеджера?
Написать свой менеджер
sigmaN
Цитата
и регулировать работу менеджера?
не использовать менеджер там где это реально не нужно и даже вредно.
Т.е. не придумывать проблем, которые потом решать(писать свой менеджер).

Всё гениальное - просто smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.