Любая причина перегрузить глобальное новое и удалить? - PullRequest
53 голосов
/ 20 июля 2009

Если вы не программируете части ОС или встроенной системы, есть ли для этого причины? Я могу себе представить, что для некоторых конкретных классов, которые создаются и уничтожаются, частая перегрузка функций управления памятью или введение пула объектов может снизить накладные расходы, но делать это глобально?

Добавление
Я только что нашел ошибку в перегруженной функции удаления - память не всегда освобождалась. И это было не так критично для памяти. Кроме того, отключение этих перегрузок снижает производительность только на ~ 0,5%.

Ответы [ 16 ]

2 голосов
/ 31 июля 2009

Плагины Photoshop, написанные на C ++, должны переопределять operator new, чтобы они получали память через Photoshop.

2 голосов
/ 28 июля 2009

Я видел, как это было сделано в системе, которая по соображениям «безопасности» * требовала перезаписи всей памяти, используемой при перераспределении. Подход заключался в том, чтобы выделить несколько дополнительных байтов в начале каждого блока памяти, который бы содержал размер всего блока, который затем будет перезаписан нулями при удалении.

Это было связано с рядом проблем, которые вы, вероятно, можете себе представить, но это сработало (в основном) и спасло команду от просмотра каждого выделения памяти в достаточно большом существующем приложении.

Конечно, я не говорю, что это хорошее применение, но, вероятно, оно является одним из наиболее творческих ...

* к сожалению, речь шла не столько о реальной безопасности, сколько о ее безопасности ...

2 голосов
/ 28 июля 2009

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

В linux вы можете поставить собственную версию malloc вместо системной, как в следующем примере:

http://developers.sun.com/solaris/articles/lib_interposers.html

В этой статье они пытаются собрать статистику производительности. Но вы также можете обнаружить утечки памяти, если вы также переопределите free.

Поскольку вы делаете это в разделяемой библиотеке с LD_PRELOAD, вам даже не нужно перекомпилировать приложение.

0 голосов
/ 26 мая 2019

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

0 голосов
/ 03 августа 2009

Как уже говорили многие, это обычно делается в приложениях, критичных к производительности, или для того, чтобы иметь возможность управлять выравниванием памяти или отслеживать вашу память. В играх часто используются собственные диспетчеры памяти, особенно при работе с конкретными платформами / консолями.

Вот довольно хороший пост в блоге об одном способе сделать это и некоторых рассуждениях.

0 голосов
/ 03 августа 2009

Наиболее распространенный вариант использования - это, вероятно, проверка на утечку.

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

...