Какие полезные функции вы получаете от переопределения оператора «new»? - PullRequest
7 голосов
/ 30 ноября 2009

Какие новые функциональные возможности (для отладки или нет) вы считаете полезными, переопределяя новый оператор?

Ответы [ 5 ]

7 голосов
/ 30 ноября 2009

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

4 голосов
/ 30 ноября 2009

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

Основной пример, с которым я лично имел дело, был для встроенных систем.

Во встроенной системе динамическое распределение памяти обычно является проблемой. Даже если у вас есть встроенная операционная система, которая поддерживает ее, у вас есть все виды проблем, с которыми вам, возможно, придется иметь дело (например, встроенные системы часто должны быть более детерминированными, чем их коллеги на ПК. Кроме того, вы можете работать в системе это должно происходить годами, в этом случае фрагментация памяти является реальной проблемой).

Из-за этого встроенные системы обычно полностью запрещают динамическое выделение памяти.

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

Чтобы проекты C ++ максимально легко использовали это динамическое выделение памяти вручную, я видел новый оператор переопределения проектов, использующий метод выделения проекта.

3 голосов
/ 30 ноября 2009

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

2 голосов
/ 30 ноября 2009

Если вы работаете с SSE / SIMD, вам обычно нужно, чтобы ваша память была выровнена по 4 словам, поэтому вы можете перегружать new, чтобы соответствующие классы использовали memalign() (тогда как по умолчанию new делать что-то эквивалентное обычному malloc()).

2 голосов
/ 30 ноября 2009

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

...