|
Динамические переменные и массивы, Можно ли задать динамические массивы ? |
|
|
|
Sep 2 2013, 07:55
|

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

|
Цитата(Navovvol @ Sep 2 2013, 11:51)  Буду краток. Работают ли операторы "new" и "delete" ? Есть ли их аналоги ? Проект делается на Си. Нет в си нет "new" и "delete", зато есть malloc и free. + ещё есть такая возможность.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 11 2013, 17:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(demiurg_spb @ Sep 2 2013, 11:55)  + ещё есть такая возможность. Для маленьких микропроцессоров не лучший способ создавать большие массивы в стеке. Мне и для больших это не нравится. Лучше malloc() in heep.
Сообщение отредактировал Tarbal - Sep 11 2013, 17:04
|
|
|
|
|
Sep 12 2013, 06:42
|

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

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

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

|
Цитата(demiurg_spb @ Sep 12 2013, 10:27)  О какой сборке мусора речь? Всё само-собой получится при раскрутке стека обратно. Значит, мы не об одном и том же говорим. Локальный массив, живущий во время исполнения функции и динамический объект, живущий вплоть до его целенаправленного уничтожения, это все-таки разные вещи. То есть, создавать так можно, на время перемещая SP в специальную огороженную область, а вот как обратно освобождать из-под произвольного объекта, да ещё в произвольный момент, что-то не представляю.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 12 2013, 08:17
|

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

|
Цитата(MrYuran @ Sep 12 2013, 11:52)  Значит, мы не об одном и том же говорим. Да. Я говорю за массивы переменной длины, и совсем не касаюсь кучи и её менеджера. Цитата Локальный массив, живущий во время исполнения функции и динамический объект, живущий вплоть до его целенаправленного уничтожения, это все-таки разные вещи. То есть, создавать так можно, на время перемещая SP в специальную огороженную область, а вот как обратно освобождать из-под произвольного объекта, да ещё в произвольный момент, что-то не представляю. Тут нет никакого произвольного времени, все не статические локальные переменные, не помещающиеся в регистрах, живут в стековом фрейме функции, жизнь которого длиться до выхода из функции. Соответственно на входе в функцию известен размер требуемого фрейма на стеке, на выходе из функции тоже. Никаких затруднений нет.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 12 2013, 12:43
|
Профессионал
    
Группа: Свой
Сообщений: 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... В совсем маленьких нет необходимости в динамической алокации массивов  Я всегда обходился. Цитата(MrYuran @ Sep 12 2013, 11:00)  Создание - да, а разрушение? Не говоря уже о сборке мусора. Проще не пользоваться динамически создаваемыми массивами
Сообщение отредактировал Tarbal - Sep 12 2013, 12:40
|
|
|
|
|
Sep 12 2013, 12:56
|

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

|
Цитата(Tarbal @ Sep 12 2013, 16:43)  Засада в том, что нет никаких способов контроля переполнения стека на момент компиляции и когда в rutime стек переполнится на крутом процессоре вы получите ексепшн, а на маленьком AVR трудноуловимые и плоховоспроизводимые странности поведения. Без никаких намеков на то, что в реальности происходит. Никакой разницы нет. Вот на куче выделили в очередной раз память - с контролем и всеми делами. А в это же время стек взял и наехал на кучу. Повторюсь, нет никаких преимуществ у кучи перед стеком. Тут всё просто, памяти либо хватает либо нет. Алгоритм оптимальный или нет. И в конечном итоге всё сводится к тому, что работает или нет. А если работает и выполняет требования ТЗ - всё, оплата в кармане, ну или на карточке))) Цитата В совсем маленьких нет необходимости в динамической алокации массивов  я тоже, но случаи бывают разные.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 13 2013, 12:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(demiurg_spb @ Sep 13 2013, 10:38)  Не соглашусь с вами. Попытка наезда кучей вызовет ошибку компиляции и никогда не будет пропущена. С наездом стэка такое невозможно, а значит в реальности только стек и будет наезжать. По поводу алгоритмов. Алгоритмы надо улучшать. В ембеддед программировании требования покруче чем при написании апликаций на PC
Сообщение отредактировал IgorKossak - Sep 13 2013, 14:54
Причина редактирования: бездумное цитирование
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|