Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Результаты опроса: Используете ли вы свои реализации new\delete?
Да 3 23.08%
Нет 10 76.92%
Голосовавшие: 13. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы
Старый 16.04.2012, 21:05   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Управление памятью.

Используете ли вы свои реализации операторов new и delete, new[] и delete[]?

Опрос открытый.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.04.2012, 21:20   #2
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Управление памятью.

зависит от задачи.
если много каких-то объектов создаются/удаляются в рантайме, то предпочитаю один раз выделить под них фиксированные пулы.
имхо, в идеале - все new должны быть на инициализации игры, все delete на выходе из игры. во время игры можно обходиться и без них.
(Offline)
 
Ответить с цитированием
Старый 16.04.2012, 21:53   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Управление памятью.

Сообщение от Mr_F_ Посмотреть сообщение
зависит от задачи.
если много каких-то объектов создаются/удаляются в рантайме, то предпочитаю один раз выделить под них фиксированные пулы.
имхо, в идеале - все new должны быть на инициализации игры, все delete на выходе из игры. во время игры можно обходиться и без них.
Ну мне интересен именно аспект: использование нестандартных реализаций new/delete
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 16.04.2012, 22:38   #4
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: Управление памятью.

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

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (16.04.2012)
Старый 16.04.2012, 23:24   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Управление памятью.

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

---
проголосовал "нет", но приврал - изменял new/delete для классов, которые обязаны были быть выравнены (внутри был _aligned_malloc)
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
ffinder (17.04.2012), HolyDel (17.04.2012), impersonalis (16.04.2012)
Старый 29.04.2012, 21:31   #6
jimon
 
Сообщений: n/a
Ответ: Управление памятью.

пишу, хотя это не совсем корректно называть каноничным переопределением 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)
Старый 29.04.2012, 21:40   #7
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Управление памятью.

полезно, но это:

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

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

делай уж все размеры связанные с выделением памяти size_t
(Offline)
 
Ответить с цитированием
Старый 29.04.2012, 21:55   #8
jimon
 
Сообщений: n/a
Ответ: Управление памятью.

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com