Форум программистов, компьютерный форум CyberForum.ru

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? - C++

Восстановить пароль Регистрация
 
 
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
25.08.2016, 14:27     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #1
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают некоторые компиляторы C++. Вместо этих функций у них есть объектные операторы new и delete. В связи с этим у меня несколько вопросов. 1. Я написал образец программы, использующей статические и динамические переменные и массивы, но вывод первого массива iarray0 почему-то не работает. 2. Я не совсем понял разницу между статическими и динамическим переменными и массивами. 3. В чем преимущества операторов new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
    int main(int argc, char **argv)
    {
        // Использование статических переменных.
        int a0;
        int b0  = 5;
        a0 = 10;
        b0 = a0 + b0;
        // Использование статических массивов.
        int num0;
        std::cout << "Введите размер массива iarray0: ";
        int iarray0[num0];
        for(int i = 0;i < num0; i++)
        {
            iarray0[i] = i;
        }
        for(int i = 0;i < num0; i++)
        {
            std::cout << "Значение элемента " << i << " массива iarray0 = " << *(iarray0 + i) << std::endl;
        }
        // Использование динамических переменных.
        int *a1 = new int;
        int *b1 = new int(5);
        *a1 = 10;
        *b1 = *a1 + *b1;
        delete a1;
        delete b1;
        // Использование динамических массивов.
        int num1;
        std::cin >> num1;
        std::cout << "Введите размер массива iarray1: ";
        std::cin >> num1;
        int *iarray1 = new int[num1];
        for(int i = 0;i < num1; i++)
        {
            iarray1[i] = i;
        }
        for(int i = 0;i < num1; i++)
        {
            std::cout << "Значение элемента " << i << " массива iarray1 = " << iarray1[i] << std::endl;
        }
        delete[] iarray1;
        return 0;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 14:27     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Посмотрите здесь:

В чем разница malloc и calloc? C++
calloc vs malloc C++
C++ Работа с памятью через malloc,realloc и free
C++ Использование calloc/realloc/free
функции на основе realloc, malloc C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
28.08.2016, 14:58     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #21
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Стек предназначен для хранения адреса того места, откуда вызвалась подпрограмма
Стек предназначен для всего чего угодно и в том числе для автоматических переменных ( ну если кончно не хватает свободных регистров ).

Добавлено через 5 минут
Цитата Сообщение от DemolitionMan Посмотреть сообщение
Под "обычные" переменные выделяется память в обычной памяти, точно также как и для динамических переменных.
Какой еще такой "обычной памяти"? Под обычные ( автоматические ) переменные или вообще память не выделяется ( в простых случаях, когда хватает регистров ), или выделяется на стеке ( а в идеале даже регистры могут не понадобиться, потому что компилятор вообще все вычисления смог соптимизировать еще в во время компиляции )


Не по теме:

Правда память на стеке конечно тоже вполне себе обычная, так что даже и не поспоришь

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
28.08.2016, 15:16     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #22
Цитата Сообщение от Babysitter Посмотреть сообщение
gcc и clang компилят, им то что, си чистый то может. через alloca реализация наверное.
без флага педантик даже варнинги не показывают, наглецы.
Дык в странице же нельзя создать массив неизвестного размера. Если не залопатить заранее страницу максимально неизвестного размера. Причём на каждый массив. С другой стороны создание массивов на стеке само по себе штука острая, но... Они не настоящие массивы там делают!
Как говорила одна моя знакомая:-"Счастье - штука недостижимая... Но с другой стороны, - его так просто имитировать!".
Никому нельзя верить.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
28.08.2016, 15:28     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #23
Цитата Сообщение от IGPIGP Посмотреть сообщение
Дык в странице же нельзя создать массив неизвестного размера. Если не залопатить заранее страницу максимально неизвестного размера. Причём на каждый массив. С другой стороны создание массивов на стеке само по себе штука острая, но... Они не настоящие массивы там делают!
Как говорила одна моя знакомая:-"Счастье - штука недостижимая... Но с другой стороны, - его так просто имитировать!".
Никому нельзя верить.
В какой странице? О чем тут вообще речь?

Произвольное кол-во памяти на стеке выделяется элементарно, для этого уменьшается регистр esp на нужно число байт. Надо на стеке 10 кб? Элементарно, все что нужно сделать - sub ESP, 10240 ( ну и конечно не забыть потом восстановить ESP ). Всякие page guard'ы для стековых страниц отработают автоматически.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
28.08.2016, 15:54     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #24
Цитата Сообщение от Voivoid Посмотреть сообщение
Произвольное кол-во памяти на стеке выделяется элементарно
Я смутно представляю эту технологию. Где почитать не подскажете?
Однако с тем что представляю, я вижу что технология вызова в С отличается от таковой в С++. Получается, что функция имея массив выделяет память поэтапно? Ведь для вычисления необходимого и заранее неизвестного объёма нужно уже предоставить какую-то рабочую область... Тогда стек С++ должен быть быстрее, ведь выделение памяти поэтапно да ещё с вычислениями, это уже путь к динамическому использованию памяти...
Я мало знаю. Надо читать.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
28.08.2016, 16:20     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я смутно представляю эту технологию. Где почитать не подскажете?
Ассемблер наверное неплохо бы хотя бы в общих чертах изучить. Я бы посоветовал http://www.apress.com/9781484200650 . pdf при желании гуглится.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ведь для вычисления необходимого и заранее неизвестного объёма нужно уже предоставить какую-то рабочую область...
Да, память под стек выделяется постранично в некоторой заранее для этого предназначенной ОС области памяти, но механизм этого выделения для пользователя в целом невидим. Просто знай себе и пиши в стек. Подробности можно здесь например посмотреть - https://geidav.wordpress.com/2013/03...k-allocations/

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако с тем что представляю, я вижу что технология вызова в С отличается от таковой в С++
Не очень понял о чем речь.
_Ivana
28.08.2016, 16:21
  #26

Не по теме:

IGPIGP, по секрету - на простых микроконтроллерах (например AVR Tiny|Mega) все просто и сердито - полный Гарвард, осы почти не летают, страницы не переворачиваются, линейная память, стек внизу - растет вверх, куча вверху - растет вниз. Для начала знакомства самое то.

kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
29.08.2016, 07:10  [ТС]     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #27
В Java переменные элементарных типов: short, int, long - обрабатываются намного быстрее, чем их объектные аналоги: Short, Integer, Long - созданые оператором new, а в C++ в моём примере статические и динамические переменные обрабатываются с одинаковой скоростью или нет?
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
29.08.2016, 09:11     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #28
kokzahvas, это совсем не тот new, который в джаве. этот new ближе к сишному malloc.
это просто такое явное выделение памяти, в каком-то абстрактном free storage, который в наших реализациях является кучей.

короче говоря, если есть некий автоматический объект (ну или не совсем объект - элементарный тип) - на стеке
и точно такой же объект, но уже динамический - на куче, адрес полученный через new,

то сами эти объекты будут абсолютно идентичными байт в байт. работа с ними по скорости никак не отличается.
но чисто технически сам момент выделения и освобождения памяти для стековых переменных быстрее
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
29.08.2016, 13:52  [ТС]     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #29
Цитата Сообщение от Babysitter Посмотреть сообщение
kokzahvas, это совсем не тот new, который в джаве. этот new ближе к сишному malloc.
Если malloc в СИ это new в C++, а free в СИ это delete в C++, то как с помощью new-expression C++ заменить realloc и calloc?
HelicopterK52
634 / 177 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
29.08.2016, 14:00     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #30
Цитата Сообщение от kokzahvas Посмотреть сообщение
и calloc?
А на кой, спрашивается оно нужно?
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
29.08.2016, 14:13     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #31
Цитата Сообщение от kokzahvas Посмотреть сообщение
заменить realloc
страуструповское чаво
kokzahvas
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 65
30.08.2016, 07:35  [ТС]     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #32
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
А на кой, спрашивается оно нужно?
Я не знаю, но если функция calloc существует, значит она нужна.

Добавлено через 3 минуты
Цитата Сообщение от Babysitter Посмотреть сообщение
Я знаю, давно надо было английский язык выучить, но видать не судьба. А вы могли бы своими словами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2016, 08:53     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Еще ссылки по теме:

Чем заменить calloc? C++
C++ Malloc / calloc
Что быстрее/эффективнее malloc/realloc или new/delete? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
30.08.2016, 08:53     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? #33
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kokzahvas Посмотреть сообщение
Если malloc в СИ это new в C++, а free в СИ это delete в C++
malloc в Cи - это operator new/operator new[] в С++.
free - соответственно, operator delete/operator delete[]

А вот new-expression и delete-expression делают больше - отвечают помимо памяти за конструкторы и деструкторы. Так что аналогов в Си этому нет. По этой же причине нет renew или чего-то подобного. Потому что недостаточно просто перевыделить или расширить память, нужно еще что-то сделать с копированием объектов (читай - вызовом конструкторов).

А Страуструп в своем FAQ пишет о двух вещах:
* realloc работает только с malloc, и не подходит, если у объекта есть нетривиальные конструкторы копирования (см. предыдущий абзац)
* В общем случае realloc все равно занимается копированием памяти.
И в качестве альтернативы расширяемого массива объектов - предлагается вектор.

При этом, вектор предлагается как генерализованное решение, для распространенных случаев. И то - он не всем нравится. Представляешь, если бы что-то такое было в ядре языка? Короче, Страуструп выбрал путь гибкости, и предоставил программисту возможность это контролировать. Т.к. в случае объектов, все заметно усложняется в зависимости от их содержимого.
Yandex
Объявления
30.08.2016, 08:53     В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc?
Ответ Создать тему

Метки
динамический массив, статический массив
Опции темы

Текущее время: 04:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru