forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Управление памятью. (http://forum.boolean.name/showthread.php?t=16657)

impersonalis 16.04.2012 21:05

Управление памятью.
 
Используете ли вы свои реализации операторов new и delete, new[] и delete[]?

Опрос открытый.

Mr_F_ 16.04.2012 21:20

Ответ: Управление памятью.
 
зависит от задачи.
если много каких-то объектов создаются/удаляются в рантайме, то предпочитаю один раз выделить под них фиксированные пулы.
имхо, в идеале - все new должны быть на инициализации игры, все delete на выходе из игры. во время игры можно обходиться и без них.

impersonalis 16.04.2012 21:53

Ответ: Управление памятью.
 
Цитата:

Сообщение от Mr_F_ (Сообщение 225699)
зависит от задачи.
если много каких-то объектов создаются/удаляются в рантайме, то предпочитаю один раз выделить под них фиксированные пулы.
имхо, в идеале - все new должны быть на инициализации игры, все delete на выходе из игры. во время игры можно обходиться и без них.

Ну мне интересен именно аспект: использование нестандартных реализаций new/delete

mr.DIMAS 16.04.2012 22:38

Ответ: Управление памятью.
 
Цитата:

Ну мне интересен именно аспект: использование нестандартных реализаций new/delete
Проголосовал за нет. Я еще ни разу не видел необходимости писать свои new\delete. Ну разве что их можно использовать для сборщика мусора и т.п. Если беспокоят утечки памяти, то стоит использовать Visual Leak Detector чем городить что-то непонятное самому( ну или возможности CRT использовать ).

Mr_F_ 16.04.2012 23:24

Ответ: Управление памятью.
 
Цитата:

Ну мне интересен именно аспект: использование нестандартных реализаций new/delete
перегружать смысла особо не вижу. т.е. это понятно что можно делать, только если у тебя уже гора кода с new/delete, и надо поменять политику работы с памятью ВДРУГ.
при этом через месяц уже можешь забыть где перегружено, где нет, и гадай как оно работает.
так что, имхо, - если выделяешь память нестандартным образом, то выделяй это читабельным путём, типа mem = myPool.Allocate(size).

---
проголосовал "нет", но приврал - изменял new/delete для классов, которые обязаны были быть выравнены (внутри был _aligned_malloc)

jimon 29.04.2012 21:31

Ответ: Управление памятью.
 
пишу, хотя это не совсем корректно называть каноничным переопределением new\delete

Код:

void AddPointer(void * pointer, const char * fileName, unsigned int lineNum, unsigned char type, unsigned int size);
void RemovePointer(void * pointer, const char * fileName, u32 lineNum, u8 type);

void * Allocate(size_t size);
void * ReAllocate(void * pointer, size_t size);
void Free(void * pointer);

#define MM_NEW(__var, __obj) \
{ \
        __var = new __obj; \
        AddPointer(__var, __FILE__, __LINE__, 0, sizeof(__obj)); \
}

#define MM_NEW_S(__obj) \
{ \
        void * __ptr = new __obj; \
        AddPointer(__ptr, __FILE__, __LINE__, 0, sizeof(__obj)); \
}

#define MM_DELETE(__var) \
{ \
        RemovePointer(__var, __FILE__, __LINE__, 0); \
        delete(__var); \
}

#define MM_NEW_A(__var, __obj, __count) \
{ \
        __var = new __obj [__count]; \
        AddPointer(__var, __FILE__, __LINE__, 1, sizeof(__obj) * __count); \
}

#define MM_NEW_S_A(__obj, __count) \
{ \
        void * __ptr = new __obj [__count]; \
        AddPointer(__ptr, __FILE__, __LINE__, 1, sizeof(__obj) * __count); \
}

#define MM_DELEMM_A(__var) \
{ \
        RemovePointer(__var, __FILE__, __LINE__, 1); \
        delete [] (__var); \
}

#define MM_NEW_P(__var, __ptr, __obj) \
{ \
        __var = new (__ptr) __obj; \
        AddPointer(__ptr, __FILE__, __LINE__, 2, sizeof(__obj)); \
}

#define MM_NEW_S_P(__ptr, __obj) \
{ \
        new (__ptr) __obj; \
        AddPointer(__ptr, __FILE__, __LINE__, 2, sizeof(__obj)); \
}

#define MM_DELEMM_P(__var, __destructor_name) \
{ \
        (__var)->__destructor_name; \
        RemovePointer(__var, __FILE__, __LINE__, 2); \
}

как плюс :
1) нету проблем с сторонними либами, потому что либа может содержать в хидерах вызов new\delete и поставляться в уже собранном виде, а мы при подключении хидера переопределим new\delete и всё сломается
2) в дебаге мы следим за каждым выделением, потому если что-то потечет то сразу узнаем где

HolyDel 29.04.2012 21:40

Ответ: Управление памятью.
 
полезно, но это:

Цитата:

unsigned int size
что за фигня, джимон?

стандартом не гарантируется sizeof(int) == sizeof(void*)
например в cl.exe на 64 битный платформах инт 32 битен.

делай уж все размеры связанные с выделением памяти size_t

jimon 29.04.2012 21:55

Ответ: Управление памятью.
 
HolyDel
помарка, виноват :) хотя это не так критично в данном месте, при выделении больше 4 гигов всего лишь в логе будет неверный размер


Часовой пояс GMT +4, время: 00:57.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot