Когда два запроса поменялись местами, они оба находятся в некоторых допустимых сконструированных состояниях. Следовательно, для обмена требуется просто поменять их внутренние компоненты, которые в основном являются указателями или целыми числами (плюс распределителями).
Однако, когда вы move-construct deque, вам нужно получить перемещен из в состояние deque, скорее всего, построено по умолчанию . Это может потребовать выполнения некоторых операций, например динамического выделения памяти c.
Например, в libstdc ++ конструктор перемещения deque (а также конструктор по умолчанию) вызывает _Deque_base::_M_initialize_map(0)
. Эта функция-член выделяет как минимум 2 узла "карты" :
this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,
size_t(__num_nodes + 2));
this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);
Фактически она выделяет как минимум 8 узлов карты, поскольку для _S_initial_map_size
установлено значение 8 .