1

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

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

char arr[100]; 

abc *pt = new(&arr)abc; 

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

ответ

0

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

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

+0

Abhay, Тема, которую вы предоставили, обсуждает вопрос о необходимости размещения новых, мой вопрос в том, почему можно было бы обеспечить его собственную реализацию вместо использования по умолчанию? – Learner

+0

@learner: Нет ничего лучше, чем размещение по умолчанию. Программист должен указать один, и причины указаны там. То, что это обычно делается на основе класса, является проблемой дизайна, где вам нужно быть осторожным с семантикой копирования (см. Coding Standards Standards - Item 45, by Sutter and Alexandrescu). – Abhay

+0

@Abhay: следующий код работает, даже если мой класс donot реализует размещение new char arr [100]; abc * pt = new (& arr) abc; Итак, я интерпретирую, есть ли место по умолчанию для размещения по умолчанию, правильно? В классе мы можем предоставить свою собственную версию, мой вопрос в том, что является прецедентом для этого? что нужно делать другим, а затем возвращать тот же самый указатель, который передается? Есть ли какой-нибудь полезный пример/сценарий, с которым вы столкнулись? – Learner

1

звучит как вопрос викторины ...

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

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

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

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

+1

@peterchen: Я перефразировал вопрос, ранее я думаю, что это больше похоже на использование нового места размещения. :-) – Learner

0

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

1

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