Должен ли я переопределить операторы new / delete в моих приложениях c ++ WIn32 - PullRequest
4 голосов
/ 05 февраля 2010

Я знаю, что сами Microsoft рекомендовали переопределять оператор new с вызовами HeapCreate () и HeapAlloc (), но это было некоторое время назад. Подробнее см. KB139638.

Буду ли я по-прежнему извлекать выгоду из переопределения нового / удаления на Win32? Какой будет рекомендуемая реализация?

ТИА.

Ответы [ 4 ]

6 голосов
/ 05 февраля 2010

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

3 голосов
/ 05 февраля 2010

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

1 голос
/ 05 февраля 2010

У вас есть причина для этого? Нет? Тогда не делай этого; шансы не сделать жизнь чрезвычайно болезненной для себя невелики.

Есть ли у вас приложение, которое вы профилировали и определили, что распределение / освобождение чего-либо является узким местом? Потому что, пока ты не сделаешь это, я бы об этом не беспокоился.

Это говорит мне о преждевременной оптомизации: -)

1 голос
/ 05 февраля 2010

Глобальная перегрузка new/delete - плохая идея (TM) для большинства случаев.

Управление памятью на уровне класса (через перегрузку) должно использоваться только при необходимости. Профилируйте свое приложение и посмотрите, является ли узкое место распределением / освобождением на основе кучи. Кроме того, все усложняется, если ваш класс может / будет получен позднее (налагает дополнительную нагрузку на разработчика, поскольку new/delete являются static членами).

Попробуйте передать распределитель (со стратегиями, чтобы вы могли проверить, что соответствует вашим потребностям наилучшим образом), аналогично тому, что делает STL.

...