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

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


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

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



Буду краток. Работают ли операторы "new" и "delete" ? Есть ли их аналоги ? Проект делается на Си.
Go to the top of the page
 
+Quote Post
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
Bear_ku
сообщение Sep 2 2013, 08:05
Сообщение #3


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

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



The operators new and delete are not implemented, attempting to use them will cause the linker to complain about undefined external references. - это для GCC, а точнее winavr-20100110. Смотрите описание на используемый вами компилятор.
И если не ошибаюсь, операторов new и delete нет в Си, это С++. Используйте malloc(), realloc(), calloc(), free().
Go to the top of the page
 
+Quote Post
Navovvol
сообщение Sep 2 2013, 08:51
Сообщение #4


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

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



Спасибо. Если задуманное получиться, покажу, что вышло.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Sep 11 2013, 17:04
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
MrYuran
сообщение Sep 12 2013, 07:00
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(demiurg_spb @ Sep 12 2013, 09:42) *
Создание динамического массива любого размера фактически не несёт никаких накладных расходов (кроме пары коррекций вершины стека

Создание - да, а разрушение?
Не говоря уже о сборке мусора.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 12 2013, 07:27
Сообщение #8


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

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



Цитата(MrYuran @ Sep 12 2013, 11:00) *
Создание - да, а разрушение?
Не говоря уже о сборке мусора.
Я говорил о создании массива переменной длины на стеке (слово динамический я в том контексте применил не к месту).
О какой сборке мусора речь? Всё само-собой получится при раскрутке стека обратно.


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


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(demiurg_spb @ Sep 12 2013, 10:27) *
О какой сборке мусора речь? Всё само-собой получится при раскрутке стека обратно.

Значит, мы не об одном и том же говорим.
Локальный массив, живущий во время исполнения функции и динамический объект, живущий вплоть до его целенаправленного уничтожения, это все-таки разные вещи.

То есть, создавать так можно, на время перемещая SP в специальную огороженную область, а вот как обратно освобождать из-под произвольного объекта, да ещё в произвольный момент, что-то не представляю.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 12 2013, 08:17
Сообщение #10


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

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



Цитата(MrYuran @ Sep 12 2013, 11:52) *
Значит, мы не об одном и том же говорим.
Да. Я говорю за массивы переменной длины, и совсем не касаюсь кучи и её менеджера.
Цитата
Локальный массив, живущий во время исполнения функции и динамический объект, живущий вплоть до его целенаправленного уничтожения, это все-таки разные вещи.
То есть, создавать так можно, на время перемещая SP в специальную огороженную область, а вот как обратно освобождать из-под произвольного объекта, да ещё в произвольный момент, что-то не представляю.
Тут нет никакого произвольного времени, все не статические локальные переменные, не помещающиеся в регистрах,
живут в стековом фрейме функции, жизнь которого длиться до выхода из функции.
Соответственно на входе в функцию известен размер требуемого фрейма на стеке, на выходе из функции тоже.
Никаких затруднений нет.


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


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

Группа: Свой
Сообщений: 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
Сообщение #12


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

Группа: Свой
Сообщений: 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
Сообщение #13


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

Группа: Свой
Сообщений: 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
Сообщение #14


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

Группа: Свой
Сообщений: 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
Сообщение #15


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

Группа: Свой
Сообщений: 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

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

 


RSS Текстовая версия Сейчас: 8th July 2025 - 09:59
Рейтинг@Mail.ru


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