Перегрузка нового и удаления по сравнению с Custom Allocator - PullRequest
0 голосов
/ 28 октября 2018

Как мне подходить к выделению памяти для моего класса.Я видел, как оба метода широко используются.Использование собственного распределителя, как и все контейнеры stl, делает его частью своего типа с параметром типа шаблона.Или перегрузите функции new и delete и, возможно, размещение new и размещение delete.Я посетил и прочитал много вопросов и ответов на оба эти метода, но я не могу понять, какой из них следует использовать в конкретном случае.Очевидно, что все контейнеры stl были разработаны с учетом специального распределителя.Почему бы вместо этого не перегрузить new и delete (и т. Д.), Чтобы удовлетворить ваши требования к памяти?Мне кажется, что перегрузка new и delete может выполнить все, что мог делать распределитель, и, фактически, возможно, легче с меньшими трудностями.Это может быть особенно актуально в C ++ 17, который поставляется с множеством возможных перегрузок, которые могут даже указывать требования выравнивания, версии тегов nothrow и т. Д.

Нам говорят, что в C ++ мы обычно должны использовать new иdelete для типичного распределения кучи (или чаще умных указателей, но сейчас это не «умное» обсуждение, это низкий уровень).Но что, если мы используем распределитель для выделения нашего объекта вместо .allocate(), а затем конструируем с .construct() (хотя я считаю, что последняя функция устарела сейчас).По сути, мы будем делать то же самое, что и new std::string{"Hello"}.

Единственное, что упоминается в Основных рекомендациях C ++ по этому вопросу, это это (т. Е. Ничего).Я не могу найти многое другое на самом деле.А как насчет безопасности потоков?Я предположил, что (настраиваемое) управление памятью, вероятно, является наиболее важным аспектом продвинутого c ++, поэтому я должен точно понимать, что я делаю.

У меня вопрос, какой из двух методов выбрать для управления памятьюмоего класса, реализация пользовательского распределителя памяти (например, контейнеров stl) или перегрузка new, delete, new[], delete[], размещение new ... и почему?Некоторые другие хорошие практики и рекомендации о том, где и когда также будут очень полезны.Заранее спасибо.

1 Ответ

0 голосов
/ 28 октября 2018

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

...