std :: deque конструктивен на перемещение, но не 'nothrow' - PullRequest
0 голосов
/ 28 февраля 2020

Вопрос довольно прост, кратко изложен в заголовке. Есть ли какая-то конкретная причина, почему это должно быть так? Учитывая, что объекты могут эффективно менять внутреннее состояние, я уверен, что здесь есть что-то, что я пропускаю ...

1 Ответ

0 голосов
/ 28 февраля 2020

Когда два запроса поменялись местами, они оба находятся в некоторых допустимых сконструированных состояниях. Следовательно, для обмена требуется просто поменять их внутренние компоненты, которые в основном являются указателями или целыми числами (плюс распределителями).

Однако, когда вы 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 .

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