Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/35: Рейтинг темы: голосов - 35, средняя оценка - 4.54
3 / 3 / 0
Регистрация: 21.08.2015
Сообщений: 17

Что быстрее/эффективнее malloc/realloc или new/delete?

21.08.2015, 14:48. Показов 8228. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Год программировал на СИ под микроконтроллеры... Начал изучать с++... Всё ново, интересно... Доковырялся до STL... В процессе изучения возникают вопросы, на которые гугл мне ответить не в состоянии...
Один из таких вопросов: Что быстрее работает при выделении/перевыделении динамической памяти malloc/realloc или new/delete? Чтобы было понятнее приведу пример кода:
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
// Как быстрее, так?:
    
        char *buf = static_cast <char*> (malloc(100 * sizeof(char))); // скажем есть 100 байт
 
        buf = static_cast <char*> (realloc(buf, 200 * sizeof(char))); // хочу из них сделать 200, так чтобы все данные из прошлых 100 остались
 
    // Или так?:
 
        char *bufer = new char[100]; // опять есть 100 байт
 
        char *temp_bufer = new char[200]; // снова хочу 200, выделяю 200
 
        memcpy(temp_bufer, bufer, 100); // копирую то что было в новый буфер
 
        delete[] bufer; // удаляю старые 100
 
        bufer = temp_bufer; // просто меняю указатель
 
    /*
        Уже не помню где, но я вычитал, что realloc работает так:
            Выделяет на новом месте 200 байт
            Копирует старые 100 байт в новые
            Удаляет старые
    */
О, ещё вопрос появился. Контейнеры (векторы, списки ...) в STL что юзают при управлении памятью?)
Заранее всем благодарен за ответы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2015, 14:48
Ответы с готовыми решениями:

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

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...

Malloc realloc и C++
Подскажите, в C++ 11 выделение памяти по прежнему &quot;нормально&quot; выделять с помощью malloc и изменять размер realloc ? Или это уже прошлое?...

32
2410 / 1947 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
21.08.2015, 22:28
Студворк — интернет-сервис помощи студентам
alator, советую посмотреть на стандартные формы объявления оператора new. Вот например:
C++
1
void* operator new(size_t size);
Если сильно утрировать - это просто функция, принимающая размер требуемой памяти и возвращающая указатель на выделенную память.

Цитата Сообщение от alator Посмотреть сообщение
Блин, я никаких технических аргументов не услышал, кроме как используйте new/delete потому что это с++ (философия)
Ну к примеру:
C++
1
2
3
4
5
// либо так
MyClass * pObj = new MyClass(100500);
// либо же
MyClass * pMem = reinterpret_cast<MyClass*>(malloc(sizeof(MyClass)));
new (pMem) MyClass(100500); // размещающий new
Что проще?
0
3 / 3 / 0
Регистрация: 21.08.2015
Сообщений: 17
21.08.2015, 22:48  [ТС]
Что проще? думаю вот эта стандартная форма оператора new самое то:
C++
1
int * p = (int*)operator new (sizeof(int)*100500) ;// а здесь уже вызов оператора new
Вопрос простоты написания это для лентяев...
Эффективнее что? realloc или new/delete ? Блин меня одного походу гложет этот вопрос... Займусь завтра тестированием...
0
2410 / 1947 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
21.08.2015, 23:38
Цитата Сообщение от alator Посмотреть сообщение
Блин меня одного походу гложет этот вопрос... Займусь завтра тестированием...
Кроме тестирования, советую ещё и литературку от умных людей почитать. Например Саттера "Решение сложных задач на С++". Узнаешь, что new/delete и malloc/free не эквивалентные вещи в принципе.

На счёт тестирования: что собираешься тестировать? Опять же советую запастись некоторым набором различных компиляторов, так как от этого результаты могут весьма отличаться.

Цитата Сообщение от alator Посмотреть сообщение
Вопрос простоты написания это для лентяев...
Эффективнее что?
Хм. Посмею сказать: что лентявее, то и эффективнее )) Ключевое слово "эффективнее". Если динамическое распределение памяти в программе при использовании new/delete занимает, например, 0.01% от общего времени выполнения, то станет ли программа эффективнее, если это число снизится до 0.001% ? А надёжнее такой код станет?
0
3 / 3 / 0
Регистрация: 21.08.2015
Сообщений: 17
22.08.2015, 00:13  [ТС]
слишком маленькая программа получается... если время на выделение 0.01% ...
А если например в одном случае проц грузится на 80% а в другом на 60% - Есть ли разница?
Если есть возможность сделать лучше, то лучше делать, написать пару лишних строчек кода, с нас программистов не убудет...
Слишком далеко мы уходим от темы... Вопрос надёжности лучше вообще не поднимать... Понятно и так, что чем надёжнее код, тем больше ресурсов он жрёт... Взять например массив с контролем границ и просто массив...
"Решение сложных задач на С++" - интересная книженция. STL доковыряю - прочту.
С тестированием не буду сильно загонятся... Возьму пару каких-нибудь передовых g++ да прогоню код
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
22.08.2015, 00:17
Лучший ответ Сообщение было отмечено alator как решение

Решение

Мне кажется обе реализации функций malloc и new будут дергать системный dll файл, в котором зашит код выделения памяти - дабы откачать код и поставить в известность систему, что какой-то процесс затребовал памяти, потому как у винды свой менеджмент памяти и на других платформах нечто подобное. Поэтому обе функции аналогичны за исключением того что new еще и конструктор вызовет проинициализировав данные, как-то так.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.08.2015, 04:45
А если например в одном случае проц грузится на 80% а в другом на 60% - Есть ли разница?
Если при этом большую часть времени в программе занимают выделения/освобождения памяти, то никакие malloc/new не спасут. Имеет смысл написать собственный аллокатор (пул объектов или тому подобное), а уж какими путями это делать - решать Вам. Можете подобрать уже готовое решение.
Вопрос простоты написания это для лентяев...
Причем здесь лень? new-expression инициализирует выделенный объект (с оговоркой на способ инициализации), а malloc и operator new просто выделяют кусок памяти, вызов конструкторов ляжет на Вас. Тоже самое относится и к delete. При delete будут вызваны деструкторы объектов, при вызове free и operator delete - вызов деструкторов на Вас.
0
3 / 3 / 0
Регистрация: 21.08.2015
Сообщений: 17
22.08.2015, 11:27  [ТС]
Причем здесь лень? new-expression инициализирует выделенный объект (с оговоркой на способ инициализации), а malloc и operator new просто выделяют кусок памяти, вызов конструкторов ляжет на Вас. Тоже самое относится и к delete. При delete будут вызваны деструкторы объектов, при вызове free и operator delete - вызов деструкторов на Вас.
Да что вы все с ярым фанатизмом цепляетесь за malloc/free и new expression, да ещё рассматривая при этом объекты (про конструкторы и деструкторы), рассказывая известные вещи... Меня интересует realloc, realloc - понимаете... Посмотрите самое первое моё сообщение пожалуйста... Разве я там использую классы?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.08.2015, 12:22
Цитата Сообщение от alator Посмотреть сообщение
да ещё рассматривая при этом объекты (про конструкторы и деструкторы)
Объекты классов взяты здесь для большей наглядности, чтобы показать различия
Цитата Сообщение от alator Посмотреть сообщение
Разве я там использую классы?
если посмотрите мое первое сообщение, то там я указал
Цитата Сообщение от Croessmah Посмотреть сообщение
инициализацию объектов
Эммм... вот примеры:
http://rextester.com/TJUYM83257
http://rextester.com/KXJ11108
http://rextester.com/LJL85349
Есть там объекты классов? Нет! А значения везде отличаются, кроме случая с new() - там всегда 0, потому как применяется direct-initialization.
Цитата Сообщение от alator Посмотреть сообщение
Да что вы все с ярым фанатизмом цепляетесь за malloc/free и new expression
Потому что это разные вещи.

Добавлено через 10 минут
Цитата Сообщение от Renji Посмотреть сообщение
Аллокаторы не умеют в ре-аллокацию. В смысле, совсем.
Нет, аллокатор (std::allocator или другой) как раз вполне может сделать подобное:
C++
1
pointer allocate(size_type n, allocator<void>::const_pointer hint = 0)
Remark: the storage is obtained by calling ::operator new(std::size_t) (18.6.1), but it is unspecified when or how often this function is called. The use of hint is unspecified, but intended as an aid to locality if an implementation so desires.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
22.08.2015, 13:27
Лучший ответ Сообщение было отмечено alator как решение

Решение

Цитата Сообщение от alator Посмотреть сообщение
Что быстрее работает при выделении/перевыделении динамической памяти malloc/realloc или new/delete?
В твоем случае realloc как минимум не медленнее.

Цитата Сообщение от alator Посмотреть сообщение
Контейнеры (векторы, списки ...) в STL что юзают при управлении памятью?)
Не realloc.

Цитата Сообщение от Croessmah Посмотреть сообщение
Нет, аллокатор (std::allocator или другой) как раз вполне может сделать подобное:
Это не реаллокация в том смысле, в каком может делать realloc. Аллокаторы действительно не умеют делать как realloc, даже proposal на эту тему есть http://www.open-std.org/jtc1/s... /n3495.htm
2
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.08.2015, 14:10
Цитата Сообщение от ct0r Посмотреть сообщение
Аллокаторы действительно не умеют делать как realloc
C++
1
2
3
4
5
6
7
8
9
10
pointer some_allocator::allocator ( size_t size , const_pointer hint = 0 )
{
   if ( hint != 0 )
   {
      //перевыделяем, с помощью того же realloc
   } else
   {
      //выделяем новый кусмян, например, с момощью malloc
   }
}
для не POD типов - трагедия.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.08.2015, 14:26
Цитата Сообщение от Croessmah Посмотреть сообщение
для не POD типов - трагедия.
Продумано.
C++
1
2
3
4
5
6
pointer some_allocator::allocator ( size_t size , const_pointer hint = 0 )
{
   if ( hint != 0 && HeapReAlloc(heap,HEAP_REALLOC_IN_PLACE_ONLY,hint,size)
        return hint;
  //выделяем новый кусмян, например, с момощью malloc
}
Хотя, разумнее было бы использовать какой ни будь callback, вызываемый realloc при перемещении данных.
1
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
22.08.2015, 14:39

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Продумано.
я про выделение с realloc :)



Добавлено через 4 минуты
Кстати, исходник из gcc-5.2
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Support routines for the -*- C++ -*- dynamic memory management.
// Copyright (C) 1997-2015 Free Software Foundation, Inc.
//
// This file is part of GCC.
//
// GCC is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.
//
// GCC is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
 
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.
 
#include <bits/c++config.h>
#include <bits/exception_defines.h>
#include "new"
 
using std::new_handler;
using std::bad_alloc;
 
extern "C" void *malloc (std::size_t);
 
_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT
{
  void *p;
 
  /* malloc (0) is unpredictable; avoid it.  */
  if (sz == 0)
    sz = 1;
 
  while (__builtin_expect ((p = malloc (sz)) == 0, false))
    {
      new_handler handler = std::get_new_handler ();
      if (! handler)
    return 0;
      __try
    {
      handler ();
    }
      __catch(const bad_alloc&)
    {
      return 0;
    }
    }
 
  return p;
}
Это к вопросу "что быстрее, operator new или malloc?".
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
22.08.2015, 17:24
А это на тему malloc/free или realloc:
http://blog.httrack.com/blog/2... -laziness/

Croessmah, да, так можно. Я бы кстати как альтернативу такому кастомному аллокатору в std::vector рассмотрел https://github.com/facebook/fo... BVector.md - там даже есть IsRelocatable в traits.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.08.2015, 17:24

malloc, realloc
У меня задан одномерный динамический массив таким образом: int *m1=new int; //n-количество элементов, вводится пользователем Далее этот...

malloc/realloc
есть следующий код: mmlist=(_mathmod*)malloc(sizeof(_mathmod)); *mmlist=_mathmod(mm); int i=0; ...

Помогите переделать malloc в realloc!
Нужно что бы распределение памяти было realoc-ом, помогите пожалуйста Красным выделен malloc //---------------------ZADANIE...

функции на основе realloc, malloc
Подскажите как сократить написание &quot;realloc&quot;, а то надоели эти писанины))) вот сделал уже следующее: size_t GetSize(void* Array) ...

Выделение памяти malloc realloc
мне задачу поставили, надо не используя stl, загрузить из файла данные. r - строки с - это столбцы выдается сообщение ...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru