|
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
|
||||||
В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?25.08.2016, 14:27. Показов 7619. Ответов 32
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают некоторые компиляторы C++. Вместо этих функций у них есть объектные операторы new и delete. В связи с этим у меня несколько вопросов. 1. Я написал образец программы, использующей статические и динамические переменные и массивы, но вывод первого массива iarray0 почему-то не работает. 2. Я не совсем понял разницу между статическими и динамическим переменными и массивами. 3. В чем преимущества операторов new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
0
|
||||||
| 25.08.2016, 14:27 | |
|
Ответы с готовыми решениями:
32
Использование calloc/realloc/free Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc? Работа с памятью через malloc,realloc и free |
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 28.08.2016, 14:58 | |||
|
Добавлено через 5 минут Под обычные ( автоматические ) переменные или вообще память не выделяется ( в простых случаях, когда хватает регистров ), или выделяется на стеке ( а в идеале даже регистры могут не понадобиться, потому что компилятор вообще все вычисления смог соптимизировать еще в во время компиляции )Не по теме: Правда память на стеке конечно тоже вполне себе обычная, так что даже и не поспоришь :)
0
|
|||
|
Комп_Оратор)
|
||
| 28.08.2016, 15:16 | ||
|
Как говорила одна моя знакомая:-"Счастье - штука недостижимая... Но с другой стороны, - его так просто имитировать!". Никому нельзя верить.
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 28.08.2016, 15:28 | ||
|
Произвольное кол-во памяти на стеке выделяется элементарно, для этого уменьшается регистр esp на нужно число байт. Надо на стеке 10 кб? Элементарно, все что нужно сделать - sub ESP, 10240 ( ну и конечно не забыть потом восстановить ESP ). Всякие page guard'ы для стековых страниц отработают автоматически.
0
|
||
|
Комп_Оратор)
|
||
| 28.08.2016, 15:54 | ||
|
Однако с тем что представляю, я вижу что технология вызова в С отличается от таковой в С++. Получается, что функция имея массив выделяет память поэтапно? Ведь для вычисления необходимого и заранее неизвестного объёма нужно уже предоставить какую-то рабочую область... Тогда стек С++ должен быть быстрее, ведь выделение памяти поэтапно да ещё с вычислениями, это уже путь к динамическому использованию памяти... Я мало знаю. Надо читать.
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||
| 28.08.2016, 16:20 | ||||
|
Добавлено через 5 минут
1
|
||||
| 28.08.2016, 16:21 | |
|
Не по теме: IGPIGP, по секрету - на простых микроконтроллерах (например AVR Tiny|Mega) все просто и сердито - полный Гарвард, осы почти не летают, страницы не переворачиваются, линейная память, стек внизу - растет вверх, куча вверху - растет вниз. Для начала знакомства самое то.
0
|
|
|
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
|
|
| 29.08.2016, 07:10 [ТС] | |
|
В Java переменные элементарных типов: short, int, long - обрабатываются намного быстрее, чем их объектные аналоги: Short, Integer, Long - созданые оператором new, а в C++ в моём примере статические и динамические переменные обрабатываются с одинаковой скоростью или нет?
0
|
|
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
| 29.08.2016, 09:11 | |
|
kokzahvas, это совсем не тот new, который в джаве. этот new ближе к сишному malloc.
это просто такое явное выделение памяти, в каком-то абстрактном free storage, который в наших реализациях является кучей. короче говоря, если есть некий автоматический объект (ну или не совсем объект - элементарный тип) - на стеке и точно такой же объект, но уже динамический - на куче, адрес полученный через new, то сами эти объекты будут абсолютно идентичными байт в байт. работа с ними по скорости никак не отличается. но чисто технически сам момент выделения и освобождения памяти для стековых переменных быстрее
0
|
|
|
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
|
||
| 29.08.2016, 13:52 [ТС] | ||
|
0
|
||
| 29.08.2016, 14:00 | |
|
0
|
|
|
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
|
|
| 29.08.2016, 14:13 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
|
|||
| 30.08.2016, 07:35 [ТС] | |||
|
Добавлено через 3 минуты
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 30.08.2016, 08:53 | ||
Сообщение было отмечено kokzahvas как решение
Решениеfree - соответственно, operator delete/operator delete[] А вот new-expression и delete-expression делают больше - отвечают помимо памяти за конструкторы и деструкторы. Так что аналогов в Си этому нет. По этой же причине нет renew или чего-то подобного. Потому что недостаточно просто перевыделить или расширить память, нужно еще что-то сделать с копированием объектов (читай - вызовом конструкторов). А Страуструп в своем FAQ пишет о двух вещах: * realloc работает только с malloc, и не подходит, если у объекта есть нетривиальные конструкторы копирования (см. предыдущий абзац) * В общем случае realloc все равно занимается копированием памяти. И в качестве альтернативы расширяемого массива объектов - предлагается вектор. При этом, вектор предлагается как генерализованное решение, для распространенных случаев. И то - он не всем нравится. Представляешь, если бы что-то такое было в ядре языка? Короче, Страуструп выбрал путь гибкости, и предоставил программисту возможность это контролировать. Т.к. в случае объектов, все заметно усложняется в зависимости от их содержимого.
1
|
||
| 30.08.2016, 08:53 | |
|
Почему так себя ведёт программа? Функции: malloc(), realloc(), free()
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|
|
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж»
Уважаемые коллеги!
Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
|
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
|
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
|
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
|