Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2013, 14:00   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию new или malloc

Чем лучше выделять динамическую память? Просто некоторые говорят что new типа с косяками. Правда ли это?
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 27.04.2013, 14:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Какими косяками?
Как ты через alloc() выделишь память для объекта, да еще и удобно для тебя создашь его там?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.04.2013, 14:56   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

c++ только new.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.04.2013, 15:18   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

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

malloc только выделяет память. Он неприменим для выделения памяти под объекты.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 27.04.2013, 15:26   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
new не просто выделит память, но и вызовет конструктор. delete, соответственно, вызовет деструктор прежде чем освободит память.

malloc только выделяет память. Он неприменим для выделения памяти под объекты.
Применим.

Он применим везде, где нужно выделить память под объект.

разместить объект в уже выделенной области памяти можно при помощи new placement.

Область использования:

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

с++ new такое не умеет. Поэтому, на крестах, даже минимальное увеличение размера блока приводит к перемещению всего куска данных на новое место.

Поскольку аллокаторы - это очень дорогие функции, то в целях оптимизации можно использовать сишные аллокаторы, и new placement

Хотя, моё личное мнение: если так сильно парит производительность работы с памятью, то лучше смотреть в сторону моральных пулов, а не плодить суржик из си/с++ стилей

Последний раз редактировалось _Bers; 27.04.2013 в 15:29.
_Bers вне форума Ответить с цитированием
Старый 28.04.2013, 16:26   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Спасибо всем за ответы)))). Решение принял
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 17.01.2014, 23:30   #7
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

Цитата:
разместить объект в уже выделенной области памяти можно при помощи new placement.
А можно посмотреть код, как это сделать?
Например выделить участок памяти и разместить объект с помощью
new placement. Где можно почитать подробнее, что при этом происходит?
vvmcpp вне форума Ответить с цитированием
Старый 18.01.2014, 09:44   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,342
По умолчанию

new работает через malloc, только не надо будет делать cast и не надо вызывать конструктор.
new можно переопределить - для всей программы или для отдельных объектов и все, что предложил bers сделать в самом new.

Насчет перемещения памяти - malloc точно так же этого не умеет, для этого есть realloc - это две разные фунцкии, соотвественно не следует утверждать, что new не умеет менять блоки. Коллекции, которым надо менять размер (а это собственно только vector) делают свистопляску с выделением совсем умышленно - таким образом объект узнает, что он переместился и может предпринят необходимые действия.

Скорость работы new и malloc абсолютно сопоставима, но сравните код:
Код:
CObject* ptr = new CObject(args);
и
Код:
CObject* ptr = (CObject*) malloc(sizeof(CObject)); 
if (0 != ptr) ptr->Init(args);
И в заключение - раз вы пишете на С++, то не надо самому выделять объекты, хоть через new, хоть через malloc() - исползуйте "умныe" указатели.

Цитата:
Сообщение от vvmcpp Посмотреть сообщение
А можно посмотреть код, как это сделать?
Например выделить участок памяти и разместить объект с помощью
new placement.
Код:
#include <new>
void* ptr = malloc(sizeof(CObject));
CObject* real_ptr = new (ptr) CObject;
Потом, вместо delete:
real_ptr->~CObject();
free(ptr);
bers имел ввиду, что можно сделать один раз malloc(sizeof(CObject) * 100); а потом делать:
new (ptr + index * sizeof(CObject)) CObject;
и создавать сам объект и тем самым избегать частых вызовов malloc но этот путь не для новичков!

Последний раз редактировалось Stilet; 18.01.2014 в 10:07.
waleri вне форума Ответить с цитированием
Старый 18.01.2014, 10:24   #9
vvmcpp
Форумчанин
 
Аватар для vvmcpp
 
Регистрация: 11.12.2010
Сообщений: 116
По умолчанию

Нашел небольшой код для распределения памяти для структуры и попытался его как-то использовать. Вот сам код и моя небольшая программа:
Код:
#include <cstdlib>
#include <iostream>

/*

Автор идеи: Eric Z (Jing), 27 Dec 2013
взято с 
http://www.codeproject.com/Articles/702065/C-Struct-Hack
Лицензия на код открытая


разбираю этот код
*/
using namespace std;

struct Foo
{
  //..
  size_t size;
  int data[1];
};

int main(int argc, char *argv[])
{
// задаем размер
const size_t SIZE = 100;

// создаем указатель на распределенный участок памяти
// больший чем размер структуры Foo
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));

// устанавливаем значение указателя на константу
p->size = SIZE;


// заполняем p->data[i]  от 0 до p->size
for (int i = 0; i < p->size; ++i) 
             {
                  p->data[i] = i;
                  
                  // вывод от 0 до 99
                  cout<<p->data[i]<<endl;
             }
             

    system("PAUSE");
    return EXIT_SUCCESS;
}
В общем я написал комментарии. Распределение памяти для меня пока сложно. Правильно ли я понял (прокомментировал) этот код?
В чем преимущества такого подхода к распределению памяти?
Автор пишет о недостатках такого подхода к памяти из-за кеша.
vvmcpp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с malloc() в СИ murtukov Помощь студентам 2 30.01.2013 09:24
функция malloc M9ICKO Общие вопросы C/C++ 26 26.07.2012 01:48
malloc в С++ _Kitten_ Помощь студентам 2 12.12.2011 19:20
Malloc Sabin4ik Общие вопросы C/C++ 12 18.02.2011 01:13
SIEGSEGV в malloc() TheVampire Общие вопросы C/C++ 0 25.09.2009 14:32