Если вы собираетесь перемещать объекты в памяти, то вы не можете сделать это в общем случае. Вы сможете сделать это только с объектами, которые знают , что они могут быть перемещены. Вам также понадобится механизм блокировки. Когда функция вызывается для объекта, ее нельзя перемещать.
Причина в том, что вся модель C ++ опирается на объекты, расположенные в фиксированных точках памяти, поэтому, если поток вызывал метод для объекта, этот поток был приостановлен, а объект перемещен, при возобновлении потока произойдет авария.
Любой объект, который содержит необработанный указатель памяти на другой объект, который может быть перемещен (включая сам подобъект), не будет работать.
Такая схема управления памятью может работать, но вы должны быть очень осторожны. Вы должны быть строгими в реализации дескрипторов и семантики блокировки дескриптора handle-> указателя.
Для контейнеров STL вы можете настроить распределитель, но он все равно должен возвращать фиксированные необработанные указатели памяти. Вы не можете вернуть адрес, который может переместиться. По этой причине, если вы используете контейнеры STL, они должны быть контейнерами дескрипторов, а сами узлы будут обычной динамически выделяемой памятью. Вы можете обнаружить, что у вас слишком много накладных расходов на косвенное обращение к дескриптору и у вас все еще есть проблемы с фрагментацией коллекций дескрипторов, чем при использовании STL.
Использование контейнеров, которые понимают ваши дескрипторы напрямую, может быть единственным способом продвижения вперед, и даже в этом случае могут быть значительные издержки по сравнению с приложением C ++, которое использует традиционные объекты, зафиксированные в памяти.