Что делать в классе конкретного варианта размещения нового? - PullRequest
1 голос
/ 27 августа 2009

Может быть предоставлена ​​новая для каждого класса версия размещения, даже если вы не можете заменить глобальную. Какие сценарии существуют, когда класс должен предоставлять собственный оператор размещения нового оператора?

Даже если мой класс не реализует размещение new, следующий код работает (при условии, что для abc оператор new не перегружен).

char arr[100];

abc *pt = new(&arr)abc; 

Итак, я понимаю, что есть новое размещение по умолчанию, но для класса мы можем предоставить нашу собственную версию оператора new, мой вопрос: каков вариант использования этого? Что один должен делать другому, а затем возвращать тот же указатель, который был передан? Есть ли полезный пример / сценарий, с которым вы столкнулись?

Ответы [ 4 ]

1 голос
/ 19 сентября 2015

К сожалению, AFAIK, вы не можете сделать перегрузку, специфичную для класса, нового оператора стандартного размещения, только пользовательских операторов нового размещения. Так что сценарий его использования немного академичен, но я хотел использовать его, чтобы запретить размещение новых в классе, используя = delete C ++ 11. Это прекрасно работает со стандартным operator new, но не для размещения новых.

1 голос
/ 27 августа 2009

Похоже на вопрос викторины ...

Ускоренное и распределенное распределение
Самая распространенная причина - множество небольших объектов, которые необходимо размещать динамически. Пользовательский распределитель для объектов фиксированного размера имеет гораздо меньше накладных расходов, чем универсальный распределитель, не страдает от фрагментации и, как правило, быстрее. (Кроме того, когда эти выделения удаляются из основной кучи, они больше не способствуют фрагментации основной кучи).

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

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

Similary (где я его использую) - это когда вы создаете код на лету. В настоящее время вы должны сообщить ОС, что данные на этой странице памяти разрешены, но вы получаете эту память довольно большими порциями (например, 4 КБ). Итак, еще раз, запросите страницу (4 КБ) у ОС с правами на выполнение, затем выделите много мелких объектов поверх нее - используя размещение new.

0 голосов
/ 10 сентября 2009

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

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

Прямо изо рта лошади вики . В разделе «Использование» подчеркивается необходимость размещения новых. Этот SO поток здесь может также помочь

UPDATE: Чтобы конкретно ответить на ваш вопрос; Вы можете использовать стандартное размещение new, предоставляемое заголовком <new>, если у вас есть пул памяти, который вы хотите использовать для построения некоторых объектов класса, но не хотите перегружать оператор new для всего класса. В последнем случае все объекты класса размещаются в соответствии с перегруженным размещением, новым, как определено в классе

...