Данные на объект в распределителях? - PullRequest
4 голосов
/ 13 августа 2011

Что такое «Данные на объект в распределителях». Я не могу понять, что это значит. У кого-нибудь есть хорошее объяснение или ссылка на то, что это означает с точки зрения языка C ++?


ПОЯСНЕНИЯ

Раздел 19.4.2 «Язык программирования C ++ (Special Edition)», стр. 573

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

Ответы [ 2 ]

5 голосов
/ 13 августа 2011

Данные для каждого объекта или локальное состояние относятся к любым элементам нестатических данных в классе распределителя.

Проблема в том, что в настоящее время (в c++03) нет поддержки распределителей с так называемым локальным состоянием. Это часто считается недостатком модели распределителя в современной c++.

Прочтите эту статью, в которой подробно описан дизайн пользовательского распределителя. В параграфе Design конкретно рассматриваются некоторые подводные камни распределителей, которые включают местное состояние.

Вкратце, некоторые операции в стандартной библиотеке в настоящее время требуют, чтобы объекты определенного типа были безопасно выделены одним экземпляром распределителя и были освобождены другим экземпляром распределителя (оба распределителя одного типа - конечно!). Это может иметь место, например, при реализации list::splice. Если распределителям разрешено иметь локальное состояние, это может быть сложно ...

В следующей редакции c++0x представляется, что распределителям будет разрешено включать локальное состояние, ознакомьтесь с разделом scoped allocator section здесь .

Надеюсь, это поможет.

1 голос
/ 13 августа 2011

Это просто означает, что std::allocator<T> не содержит каких-либо элементов данных для каждого экземпляра ... это в основном оболочка для функций выделения и освобождения памяти, а также содержит определения определенных требуемых typedef, а также механизмы для повторного связываниясуществующий распределитель, чтобы он мог распределять типы, которые не были частью первоначальной реализации шаблона распределителя.Таким образом, в основном то, что утверждается, заключается в том, что, если бы существовали частные частные элементы данных, которыми нужно было управлять, особенно в свете требования к распределителю STL для разрешения повторного связывания, это могло бы значительно усложнить реализацию универсального распределителя в зависимости отПредставлены элементы-данные для каждого экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...