STL пользовательские средства выделения для управления различными пространствами памяти

Решение от suhail работало для меня без необходимости включать citext, довольно простое решение, только чистая функция и вместо заглавных букв я использовал upper(). Решение Маюреша также работает, но изменило поле с CharField на TextField.

class State(models.Model):

    name = models.CharField(max_length=50, unique=True)

    def clean(self):
        self.name = self.name.upper()
8
задан boiler96 21 October 2009 в 23:21
поделиться

3 ответа

К сожалению, у распределителей STL не может быть состояния (или, по крайней мере, нужно быть очень осторожным при использовании этого состояния) - каждый экземпляр определенного типа распределителя должен быть эквивалентен, чтобы контейнеры STL могли эффективно работать с ними. . Я не помню подробностей прямо сейчас, но я знаю, что Скотт Мейерс подробно обсуждает эту проблему в «Эффективный STL» , пункт 10: Знайте соглашения и ограничения распределителя.

Однако вы могут иметь шаблонные распределители, которые очень похожи с различиями между распределителями, инкапсулированными в тип распределителя, и используют разные «экземпляры» шаблона распределителя (каждый шаблон «создание экземпляра» - это другой тип). Опять же, я припоминаю, что Мейерс довольно ясно обсуждает это.

Например, см. Этот абзац из статьи Энтони Ауэ, «Повышение производительности с помощью настраиваемых распределителей пула для STL» :

Потенциально более серьезным предупреждением является то, что, поскольку распределитель использует нестатические данные, технически он не соответствует стандарту, потому что стандарт требует, чтобы распределители одного типа были эквивалентными. См. «Эффективный STL» (пункт 10) для подробного объяснения проблемы. Это равносильно требованию, чтобы распределитель для данного типа мог освобождать память, выделенную любым другим экземпляром распределителя для этого типа. Для многих случаев использования стандартных контейнеров это требование не требуется (некоторые могут сказать «драконовское»). Однако есть два случая, когда это требование абсолютно необходимо: list :: splice и swap (). Случай swap () особенно серьезен, потому что он необходим для реализации определенных операций с контейнерами безопасным для исключений способом (см. Исключительный C ++, Правило 12). Технически своп может быть (а в некоторых случаях и есть) реализован в отношении распределителей, которые не сравниваются одинаково - элементы могут быть скопированы или распределители могут быть заменены местами вместе с данными - но это не всегда так. По этой причине, если вы используете swap () или list :: splice, вы должны обязательно использовать HoldingPolicySingleton; в противном случае вы обязательно столкнетесь с действительно неприятным поведением.

См. также обсуждение Стефана Т. Лававежа в этой ветке группы новостей .

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

is) реализован перед распределителями, которые не сравниваются одинаково - элементы могут быть скопированы или распределители могут быть заменены местами вместе с данными - но это не всегда так. По этой причине, если вы используете swap () или list :: splice, вы должны обязательно использовать HoldingPolicySingleton; в противном случае вы обязательно столкнетесь с действительно неприятным поведением.

См. также обсуждение Стефана Т. Лававежа в этой ветке группы новостей .

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

is) реализован перед распределителями, которые не сравниваются одинаково - элементы могут быть скопированы или распределители могут быть заменены местами вместе с данными - но это не всегда так. По этой причине, если вы используете swap () или list :: splice, вы должны обязательно использовать HoldingPolicySingleton; в противном случае вы обязательно столкнетесь с действительно неприятным поведением.

См. также обсуждение Стефана Т. Лававежа в этой ветке группы новостей .

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

17
ответ дан 5 December 2019 в 07:11
поделиться

Контейнеры STL позволяют передавать распределитель в качестве аргумента конструктору.

Например, вот соответствующие конструкторы для вектора:

explicit vector(const Allocator& = Allocator());
explicit vector(size_type n, const T& value = T(),
  const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,
  const Allocator& = Allocator());

По умолчанию они просто используют сконструированный распределитель по умолчанию.

6
ответ дан 5 December 2019 в 07:11
поделиться

Perhaps you could code a set of allocator types which contains a static pointing to seperate memory spaces.

Then, when the STL container constructs its allocator, the allocator uses the memory spaceassigned to that allocator.

For simplicity, assume you want to use two memory spaces. Create two allocator types, one for each space. Pass the allocator type to the STL container constructors as required.

0
ответ дан 5 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: