Что означает, что распределитель не имеет состояния? Я понимаю, что std :: allocator является оберткой вокруг malloc и не имеет собственного состояния. В то же время malloc ведет свою собственную бухгалтерию, поэтому можно сказать, что все экземпляры std :: allocator используют одно состояние.
Как бы я пошел о реализации распределителя пула без состояния? Если бы не распределитель, что бы сохранить текущее состояние памяти?
Может ли кто-то формально определить, что означает государство в этом контексте?
Состояние означает, что экземпляры класса содержат изменяемую информацию. Безгражданство означает, что у них его нет. Классы без сохранения состояния не имеют нестатических элементов данных.
Вы можете сделать распределитель пула не имеющим состояния, используя некоторое взаимное внешнее состояние (пул), одинаковое для всех распределителей пула этого типа.
Сам объект-распределитель не рекомендуется сохранять состояние. Это означает, что если вы создаете экземпляр std::allocator
(или ваш собственный), этот экземпляр не должен содержать никакой информации о выделенных блоках и т. д. — эта информация должна быть static
и поделился на всех std::allocator
экземпляров. Нарушение этого правила может привести к неопределенному поведению в библиотеках STL.
Например, посмотрите на std::list::splice
: удаляет и интервал элементов из одного std::list
и вставить в другие. На самом деле ничего не сделано с содержащимися элементами (без копирования и т. Д.) — этот метод просто переставляет внутренние указатели. Так что если std::allocator
экземпляр № 1 (в списке № 1) знает что-то, что не знает std::allocator
экземпляр № 2 (в списке № 2)? Эти элементы будут потеряны, запомнены, спонтанно удалены или как угодно ..
Хорошее чтение о таких вещах на STL — «Эффективный STL», Скотт Мейерс