Placement New
Лучший пример - подумать о std :: vector
Как std :: vector помещает новые элементы в массив?
Когда вы добавляетеНовый элемент в конце вектора должен использовать размещение new.
class MyVector
{
char* data;
size_t size;
MyVector() : size(0), data(new char[1000]) {}
// Placement new copy construction of element into array.
void push_back(T const& t) { new (data + (sizeof(T) * size)) T(t); ++size;}
};
Помните, что вы не можете использовать присваивание или простую копию, потому что элемент еще не существует в массиве (т. е. пространство памяти непока T (его значение не определено)), поэтому вы должны создать новый, чтобы создать новый объект T в массиве.
Так что думайте о размещении new как о способе создания контейнерных объектов.Вы можете выделить больше места, чем требуется для контейнера (и не инициализировать его).Затем используйте размещение new, чтобы инициализировать элементы при их добавлении.
Перегрузка новой
Перегрузка новой позволяет контролировать пространство, используемое, когда объект имеет dynamic storage duration
.Возможно, ваши ожидаемые шаблоны использования не подпадают под обычные шаблоны использования, и вы хотите оптимизировать создание / уничтожение.Возможно, вы хотите создать собственную сборку мусора (для определенного типа).
Основное отличие состоит в следующем:
- Перегрузка новых элементов управления созданием пространства для «динамического хранилища»объекты длительности.
- Размещение можно использовать как для динамических, так и для автоматических объектов продолжительности хранения (я полагаю, также статических).И используется внешне для управления объектами.
Обзор:
Оба являются угловыми случаями для языка и редко используются в обычном коде (я думаю, что я написал 2 новых перегрузки и один класскоторый использует размещение новых (для реального производственного кода / не включает эксперименты и тестирование) в течение 15 лет).
К тому времени, когда вам понадобится использовать эти конструкции в реальной жизни, вы будете работать с опытной командой дляпару лет, которые могут подтвердить ваш дизайн.