реклама на сайте
подробности

 
 
> Динамические переменные и массивы, Можно ли задать динамические массивы ?
Navovvol
сообщение Sep 2 2013, 07:51
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



Буду краток. Работают ли операторы "new" и "delete" ? Есть ли их аналоги ? Проект делается на Си.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demiurg_spb
сообщение Sep 2 2013, 07:55
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Navovvol @ Sep 2 2013, 11:51) *
Буду краток. Работают ли операторы "new" и "delete" ? Есть ли их аналоги ? Проект делается на Си.

Нет в си нет "new" и "delete", зато есть malloc и free.
+ ещё есть такая возможность.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 11 2013, 17:04
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(demiurg_spb @ Sep 2 2013, 11:55) *
+ ещё есть такая возможность.


Для маленьких микропроцессоров не лучший способ создавать большие массивы в стеке.
Мне и для больших это не нравится. Лучше malloc() in heep.

Сообщение отредактировал Tarbal - Sep 11 2013, 17:04
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 12 2013, 06:42
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Tarbal @ Sep 11 2013, 21:04) *
Для маленьких микропроцессоров не лучший способ создавать большие массивы в стеке.
Мне и для больших это не нравится. Лучше malloc() in heep.
Ничем не лучше.
Если компилятор умеет хорошо это делать, почему бы и нет?
Например iar-avr это делает отлично, а avr-gcc плохо.
Создание динамического массива любого размера фактически не несёт никаких накладных расходов (кроме пары коррекций вершины стека, что в iar выливается в 2 асм-инструкции или в ноль инструкций, если и так в процедуре выделялось место для стекового фрейма).
В совсем маленьких контроллерах и эти 4 байта на вес золото. А вы говорите malloc...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 12 2013, 12:43
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(demiurg_spb @ Sep 12 2013, 10:42) *
Ничем не лучше.
Если компилятор умеет хорошо это делать, почему бы и нет?
Например iar-avr это делает отлично, а avr-gcc плохо.
Создание динамического массива любого размера фактически не несёт никаких накладных расходов (кроме пары коррекций вершины стека, что в iar выливается в 2 асм-инструкции или в ноль инструкций, если и так в процедуре выделялось место для стекового фрейма).
В совсем маленьких контроллерах и эти 4 байта на вес золото. А вы говорите malloc...


Засада в том, что нет никаких способов контроля переполнения стека на момент компиляции и когда в rutime стек переполнится на крутом процессоре вы получите ексепшн, а на маленьком AVR трудноуловимые и плоховоспроизводимые странности поведения. Без никаких намеков на то, что в реальности происходит.

Цитата(demiurg_spb @ Sep 12 2013, 10:42) *
В совсем маленьких контроллерах и эти 4 байта на вес золото. А вы говорите malloc...


В совсем маленьких нет необходимости в динамической алокации массивов sm.gif
Я всегда обходился.



Цитата(MrYuran @ Sep 12 2013, 11:00) *
Создание - да, а разрушение?
Не говоря уже о сборке мусора.


Проще не пользоваться динамически создаваемыми массивами sm.gif

Сообщение отредактировал Tarbal - Sep 12 2013, 12:40
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 12 2013, 12:56
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Tarbal @ Sep 12 2013, 16:43) *
Засада в том, что нет никаких способов контроля переполнения стека на момент компиляции и когда в rutime стек переполнится на крутом процессоре вы получите ексепшн, а на маленьком AVR трудноуловимые и плоховоспроизводимые странности поведения. Без никаких намеков на то, что в реальности происходит.
Никакой разницы нет. Вот на куче выделили в очередной раз память - с контролем и всеми делами. А в это же время стек взял и наехал на кучу.
Повторюсь, нет никаких преимуществ у кучи перед стеком.
Тут всё просто, памяти либо хватает либо нет. Алгоритм оптимальный или нет. И в конечном итоге всё сводится к тому, что работает или нет.
А если работает и выполняет требования ТЗ - всё, оплата в кармане, ну или на карточке)))

Цитата
В совсем маленьких нет необходимости в динамической алокации массивов sm.gif
я тоже, но случаи бывают разные.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 12 2013, 15:07
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(demiurg_spb @ Sep 12 2013, 16:56) *
Никакой разницы нет. Вот на куче выделили в очередной раз память - с контролем и всеми делами. А в это же время стек взял и наехал на кучу.
Повторюсь, нет никаких преимуществ у кучи перед стеком.
Тут всё просто, памяти либо хватает либо нет. Алгоритм оптимальный или нет. И в конечном итоге всё сводится к тому, что работает или нет.
А если работает и выполняет требования ТЗ - всё, оплата в кармане, ну или на карточке)))

я тоже, но случаи бывают разные.


Неверно. Стек сам по себе не наедет. Значит кто-то стеком неправильно пользуется. Алокация массивов на стеке это хороший способ наехать стеком. Если не делать таких вещей, то и проблем не будет. Использование кучи гарантирует от таких сюрпризов. Если нет фокусов с использованием стека.

Я сделал немало устройств и никогда не использовал динамическую алокацию. Значит можно обойтись.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 13 2013, 06:38
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Спор бесполезен.
Вы не понимаете моей основной мысли, что неважно кто наедет (стек или куча), важно то, что использовании кучи более ресурсоёмко чем стека.
А использование динамических массивов иногда очень красиво решает проблему нехватки памяти.
Вот пример (только что выдумал):
Алгоритм 1 (требует более половины ОЗУ для своего выполнения)
Алгоритм 2 (требует более половины ОЗУ для своего выполнения)
...
Алгоритм N (требует более половины ОЗУ для своего выполнения)

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 13 2013, 12:29
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(demiurg_spb @ Sep 13 2013, 10:38) *


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

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

Сообщение отредактировал IgorKossak - Sep 13 2013, 14:54
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 13 2013, 12:40
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Tarbal @ Sep 13 2013, 16:29) *
Попытка наезда кучей вызовет ошибку компиляции и никогда не будет пропущена.

Как это? Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам).
И всё это гипотетически реализовано через кучу. Вдруг выходной канал отваливается, а на входе поток не прерываем (так случилось).
А вы продолжаете создавать на куче пакты, пока она не закончится.
Вопрос: как вам применение кучи поможет на этапе компиляции? (отвечайте пожалуйста конкретно и не юлите)

Цитата
По поводу алгоритмов. Алгоритмы надо улучшать. В ембеддед программировании требования покруче чем при написании апликаций на PC
Только не надо меня кормить этими дежурными фразами, что не надо, а что надо...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 13 2013, 13:22
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(demiurg_spb @ Sep 13 2013, 16:40) *
Как это? Приходят пакеты из одно порта и ретранслируются в другой (по разным протоколам).
И всё это гипотетически реализовано через кучу. Вдруг выходной канал отваливается, а на входе поток не прерываем (так случилось).
А вы продолжаете создавать на куче пакты, пока она не закончится.
Вопрос: как вам применение кучи поможет на этапе компиляции? (отвечайте пожалуйста конкретно и не юлите)

Только не надо меня кормить этими дежурными фразами, что не надо, а что надо...


Хороший пример
При использовании кучи не возникнет никаких странных багов. Просто malloc() будет возвращать ноль вместо поинтера на область памяти. Если апликация написана грамотно, то будет выдано сообщение об ошибке, ну и работа устройства будет остановлена до устранения проблемы, после которого устройство продолжит свою работу.
На этапе компилляции я буду знать, что случится именно так и требуемая память не будет взята у чужого сегмента.

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

Скажите, у вас создалось впечатление, что я уклоняюсь от ответов на какие-то ваши вопросы? Укажите мне на эти вопросы и вы увидите, что ваше впечатление ошибочно. Я прадоставлю вам исчерпывающий ответ.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Navovvol   Динамические переменные и массивы   Sep 2 2013, 07:51
|- - MrYuran   Цитата(demiurg_spb @ Sep 12 2013, 09:42) ...   Sep 12 2013, 07:00
||- - demiurg_spb   Цитата(MrYuran @ Sep 12 2013, 11:00) Созд...   Sep 12 2013, 07:27
||- - MrYuran   Цитата(demiurg_spb @ Sep 12 2013, 10:27) ...   Sep 12 2013, 07:52
||- - demiurg_spb   Цитата(MrYuran @ Sep 12 2013, 11:52) Знач...   Sep 12 2013, 08:17
|- - kolobok0   Цитата(Tarbal @ Sep 13 2013, 17:22) ..А в...   Sep 13 2013, 14:51
|- - demiurg_spb   Цитата(Tarbal @ Sep 13 2013, 17:22) Скажи...   Sep 13 2013, 15:03
|- - Tarbal   Цитата(demiurg_spb @ Sep 13 2013, 19:03) ...   Sep 13 2013, 15:24
- - Bear_ku   The operators new and delete are not implemented, ...   Sep 2 2013, 08:05
- - Navovvol   Спасибо. Если задуманное получиться, покажу, что ...   Sep 2 2013, 08:51
- - DASM   На самом деле в эмбеддед всякие alloc штука хороша...   Sep 13 2013, 13:35
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 17:35) На само...   Sep 13 2013, 13:50
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 17:35) На само...   Sep 13 2013, 14:08
- - DASM   Причем тут рекурсия вообще ? Данные принимаются в ...   Sep 13 2013, 14:01
- - DASM   Да не буду я ничего приводить, берете какие-то лев...   Sep 13 2013, 14:28
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 18:28) Да не б...   Sep 13 2013, 14:48
|- - DASM   Цитата(Tarbal @ Sep 13 2013, 18:48) а во-...   Sep 13 2013, 14:52
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 18:52) "А...   Sep 13 2013, 14:58
- - DASM   Вобщем malloc использовать стал в микроконтролерах...   Sep 13 2013, 15:42
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 19:42) Вобщем ...   Sep 13 2013, 15:58
- - DASM   Не слишком . Это гораздо безопаснее всего остально...   Sep 13 2013, 16:07
|- - Tarbal   Цитата(DASM @ Sep 13 2013, 20:07) Не слиш...   Sep 13 2013, 19:46
|- - _Pasha   Цитата(Tarbal @ Sep 13 2013, 22:46) СОЗДА...   Sep 14 2013, 04:57
|- - DASM   Цитата(_Pasha @ Sep 14 2013, 08:57) Очеви...   Sep 14 2013, 06:50
|- - _Pasha   Цитата(DASM @ Sep 14 2013, 09:50) Один во...   Sep 14 2013, 12:27
- - IgorKossak   Tarbal, смотрите мой комментарий к Вашему предыдущ...   Sep 13 2013, 16:09
- - DASM   Динамические на стеке ? Это как ? Учить Вас и не д...   Sep 14 2013, 04:33
|- - Tarbal   Цитата(DASM @ Sep 14 2013, 08:33) Динамич...   Sep 15 2013, 23:52
|- - demiurg_spb   Цитата(Tarbal @ Sep 16 2013, 03:52) А вы ...   Sep 30 2013, 07:13
- - Tarbal   Куда ушли те времена, когда требовалось мастерство...   Sep 14 2013, 13:49
- - _Pasha   Кстати, понравившийся многим манагер кучи от Zltig...   Sep 14 2013, 22:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.02864 секунд с 7
ELECTRONIX ©2004-2016