Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202

New и malloc

04.05.2016, 18:33. Показов 2507. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если смотреть на выделение памяти для арифметических типов уступает ли функций new malloc'у в скорости? Если да, то насколько это критично?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2016, 18:33
Ответы с готовыми решениями:

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница междуs=malloc(sizeof(char)); иs=(char *)malloc(sizeof(char));Буду признателен вашим...

new vs malloc
Чем new безопаснее(или лучше?) malloc?

malloc в С++
Подскажите пожалуйста как в данной программе выделить динамическую память с помощью malloc для объекта #include <iostream> ...

18
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.05.2016, 19:12
Зависит от того, что внутри new. Если в new тот же malloc, то да, уступает, вызов дополнительной ф-ции требует затрат. Если внутри new грубо говоря копипаста из malloc, то тогда не уступает.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.05.2016, 19:14
Цитата Сообщение от Lawliet1 Посмотреть сообщение
насколько это критично?
Ты не заметишь разницы.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
04.05.2016, 19:51  [ТС]
Kastaneda,
если рассматривать арифметические типы - new вызывает malloc и возвращает указать на выделенную память (или бросает исключение)... других затрат (за исключение того, что new - надстройка над malloc) нет.. все верно?

nmcf,
да я в курсе, просто хочю расставить все точки над и
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.05.2016, 19:53
Цитата Сообщение от Lawliet1 Посмотреть сообщение
да я в курсе, просто хочю расставить все точки над и
тогда - зависит от реализации, но у new-expression, более сложная логика (new-handler, исключения).
Цитата Сообщение от Lawliet1 Посмотреть сообщение
нет.. все верно?
Вызов new-handler, ну и new-expression вызывает operator new,
а не malloc, а уже operator new занимается выделением памяти.
Так что уточните, Вы сравниваете operator new с malloc или же new-expression с malloc?
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
04.05.2016, 20:36  [ТС]
Croessmah,
я спрашиваю о сравнении malloc и operator new (который в свою очередь вызывает библиотечные функции new, которые можно перегрузить)

Добавлено через 7 минут
malloc у нас что делает? - выделяет память с хламом внутри...
new (оператор, не функция operator new ()) что делает - выделяет память и вызывает конструктор для объектов в выделенной памяти...

собственно меня и интересует для обычных арифметических типов, у которых по факту и конструктора никакого нет, new тратит время на их инициализацию чем-то или как malloc возвращает с хламом внутри?

Добавлено через 16 минут
Вот допустим программа:
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
#include <iostream>
 
//========================================
 
int main()
{
    auto i1 = new int[10];
    auto i2 = (int*) malloc(10);
 
    auto it1 = i1;
    auto it2 = i2;
 
    while (it1 != i1 + 10)
        std::cout << *it1++ << " ";
    std::cout << std::endl;
 
    while (it2 != i2 + 10)
        std::cout << *it2++ << " ";
    std::cout << std::endl;
 
    delete[] i1;
    free(i2);
 
 
    return 0;
}
массив созданный оператором new содержит хлам, но все элементы равны... чего не скажешь о массиве созданном с помощью malloc... собственно появляется вопрос - неужели new инициализирует каждый созданный в выделенной памяти элемент -> если элементов будет несколько миллионов, то он значительно уступит по скорости malloc'у который просто возвратит память с хламом (рандомным) внутри
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.05.2016, 20:42
Просто совпадение. Массив побольше возьми.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
04.05.2016, 20:52  [ТС]
nmcf, только что переписал с массивами на 30, 50, 100 - уже думал писать что эффект тот же (все элементы массива new были одинаковые ), но в массиве на 500 элементов картина поменялась)))

в любом случае это не отменяет изначального вопроса... я даже немного перефразирую: верно ли, что различие в скорости выделения памяти для арифметических типов operator-ом new и malloc настолько ничтожно, что можно смело везде использовать new??? (ибо у него есть свои плюшки - исключения, нормальная работа с объектами)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.05.2016, 22:04
Цитата Сообщение от Lawliet1 Посмотреть сообщение
я спрашиваю о сравнении malloc и operator new (который в свою очередь вызывает библиотечные функции new, которые можно перегрузить)
Вы явно что-то перепутали.
Немного есть по теме здесь.
Цитата Сообщение от Lawliet1 Посмотреть сообщение
new (оператор, не функция operator new ())
operator(именно оператор) new - это как раз функция:
C++
1
2
3
void* p1 = operator new(/*bla-bla-bla*/);//operator new
int* p2 = new int(/*bla-bla-bla*/);//new-expression (first alternatives)
int* p3 = new int[/*bla-bla-bla*/];//new-expression (second alternatives)
Добавлено через 1 минуту
Цитата Сообщение от Lawliet1 Посмотреть сообщение
new тратит время на их инициализацию чем-то или как malloc возвращает с хламом внутри?
operator new - ничего не инициализирует (и не может в принципе).
new-expression, в зависимости от формы
записи будет вести себя по разному.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.05.2016, 22:21
Цитата Сообщение от Lawliet1 Посмотреть сообщение
что можно смело везде использовать new???
Это бессмысленная формулировка. Используешь C++ - значит new.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
04.05.2016, 22:47  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы явно что-то перепутали.
ага, причем везде еще и программу на 25 строк криво написал (malloc - выделение в байтах)... возвращаясь к начальному вопросу - перефразирую с использованием правильных терминов: я сравниваю new-expression и malloc при этом в new инициализатор не указан, существенна ли разница в скорости работы между ними? то что new работает в два этапа и из-за этого там больше работы, это ясно... вопрос немного в другом: если выделяется память скажем на миллион элементов любого арифметического типа, то new инициализирует их default-initialization и тратит на это время или нет (потому как malloc не инициализирует и возвращает сырой кусок памяти аля void* и если new инициализирует каждый элемент - разница в скорости должна быть существенной)?????

Цитата Сообщение от nmcf Посмотреть сообщение
Это бессмысленная формулировка. Используешь C++ - значит new.
ну и зачем придираться к словам... неужели так сложно просто ответить на вопрос, если знаешь ответ....
а по поводу new и C++ давайте пойдем дальше - в топку new когда в 11 стандарте shared_ptr и unique_ptr, да и вообще есть контейнеры и незачем этим new вообще пользоваться...
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.05.2016, 06:04
Лучший ответ Сообщение было отмечено Lawliet1 как решение

Решение

Цитата Сообщение от Lawliet1 Посмотреть сообщение
то new инициализирует их default-initialization и тратит на это время или нет
default-initialization:
8.5 Initializers
...
7. To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor (12.1) for T is called (and the initialization is ill-formed if T has no default constructor or overload resolution (13.3) results in an ambiguity or in a function that is deleted or inaccessible from the context of the initialization);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.
итого, для фундаментальных типов инициализация не производится
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.05.2016, 11:50
Цитата Сообщение от Lawliet1 Посмотреть сообщение
в топку new когда в 11 стандарте shared_ptr и unique_ptr, да и вообще есть контейнеры и незачем этим new вообще пользоваться...
Тем более незачем пользоваться malloc().

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
— if T is an array type, each element is default-initialized;
А это к чему относится?
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
06.05.2016, 11:57  [ТС]
nmcf,
просто сейчас изучаю WinAPI по Петцольду, а там все на С и везде этот malloc...
собственно просто хотел убедиться, что new не тратит время на инициализацию каждого элемента в динамически выделенном массиве, ибо потери в скорости при таком подходе были б ощутимы... собственно нелогично было б использовать new, вместо malloc в таком случае...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.05.2016, 12:08
Lawliet1, сколько лет этой книжке? В WinAPI свои функции для памяти, если уж так хочется такое использовать.
0
31 / 34 / 18
Регистрация: 30.09.2011
Сообщений: 202
06.05.2016, 12:19  [ТС]
nmcf, это эти что ли: GlobalAlloc, GlobalReAlloc и др? они по факту от malloc'a мало чем отличаются и в таком случает лучше юзать new...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.05.2016, 19:02
Цитата Сообщение от Lawliet1 Посмотреть сообщение
ибо потери в скорости при таком подходе были б ощутимы
прохладная история.

в масштабе процессора,
операция выделения памяти - это вечность,
по сравнению с операциями,
которые не требуют дополнительных ресурсов.

за то время, пока выполняется одна аллокация,
вручную можно было бы кучу всего проинициализировать.

хотите сэкономить:
минимизируйте количество аллокаций,
а не количество инициализаций.
0
24 / 24 / 8
Регистрация: 02.02.2016
Сообщений: 135
06.05.2016, 20:12
Такие вопросы стараюсь тестировать.
Например этим кодом:
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
#include <iostream>
#include <conio.h>
#include <ctime>
using namespace std;
 
int main()
{
    time_t t0, t1, t2;
    t0 = clock();
    for (int i=0; i < 0xfffff; i++)
    {
        for (int k=0; k < 0xff; k++)
        {int a=0;}
    }
    t1 = clock()-t0;
    cout << "empty " << (double)(t1/CLOCKS_PER_SEC) << " sec." << endl;
    t0 = clock();
    for (int i=0; i < 0xfffff; i++)
    {
        for (int k=0; k < 0xff; k++)
        {
            int *a = new int [10];
            delete [] a;
        }
    }
    t2 = clock()-t0;
    cout << "new/delete " << (double)(t2/CLOCKS_PER_SEC) << " sec. Difference = " << (double)((t2-t1)/CLOCKS_PER_SEC) << " sec." << endl;
    t0 = clock();
    for (int i=0; i < 0xfffff; i++)
    {
        for (int k=0; k < 0xff; k++)
        {
            int *a = (int*) malloc(40);
            free(a);
        }
    }
    t2 = clock()-t0;
    cout << "malloc/free " << (double)(t2/CLOCKS_PER_SEC) << " sec. Difference = " << (double)((t2-t1)/CLOCKS_PER_SEC) << " sec." << endl;
 
_getch();
}
получил результат:
empty 1 sec.
new/delete 299 sec. Difference = 298 sec.
malloc/free 297 sec. Difference = 296 sec.

Разница конечно есть, но незначительная.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.05.2016, 22:51
Цитата Сообщение от Petrolion Посмотреть сообщение
Разница конечно есть, но незначительная.
которая будет варьировать в известных пределах от запуска к запуску.
в перспективе получаем монопенисуальный фактор.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2016, 22:51
Помогаю со студенческими работами здесь

Malloc vs new
Здравствуйте. Вникаю в ручное управление памятью. Абзац из книги &quot;C++ для профессионалов&quot; не совпадает с моим представлением...

malloc
Народ, кто-нить может объяснить какие есть недостатки у этой функции, всегда юзал, а тут говорят, что это очень нехорошо, вот и стало...

new, malloc,
Добрый день. При роботе с дин. памяттю в конец выделяемой памяти добавляеться какойто бред, чтото топа &quot;&lt;&lt;&lt;ЮЮЮээээ&quot;....

new на malloc
Измените выделение памяти на C - malloc,и почему у меня не открывает текстовый файл? #include &quot;stdafx.h&quot; #include...

Malloc си
распределить память для массива из 80 символов с помощью функции malloc. Прочитать в эту память строку с клавиатуры. Вывести полученный...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru