Ответ 1
-
Конструктор postblit вызывается всякий раз, когда структура копируется - например. при передаче структуры в функцию.
-
Перемещение - побитовая копия. Конструктор postblit никогда не вызывается. Деструктор никогда не называется. Биты просто копируются. Оригинал был "перемещен", и поэтому ничего не нужно создавать или уничтожать.
-
Он будет перемещен. Это яркий пример движения.
-
Существует множество различных ситуаций, о которых вам нужно будет беспокоиться о функции
swap
, если вы хотите сделать ее максимально эффективной. Я бы посоветовал просто использовать функцию swap в std.algorithm. Классический обмен приведет к копированию и, таким образом, вызовет конструктор postblit и деструктор. Переходы обычно выполняются компилятором, а не программистом. Однако смотря на официальную реализациюswap
, похоже, что он играет некоторые трюки, чтобы получить семантику перемещения из сделки, где она может. Несмотря на это, ходы, как правило, выполняются компилятором. Они оптимизируют его, когда он знает, что он может (RVO быть классическим случаем, когда он может).
В соответствии с TDPL (стр. 251) есть только 2 случая, когда D гарантирует, что движение будет иметь место:
- Все анонимные значения перемещаются, а не копируются. Вызов
this(this
) никогда не вставлен, когда источник является анонимным значением r (например, a временный, как показано в функцииhun
выше).- Все названные временные ряды, которые распределены по стекам внутри функции и затем вернул вызов
this(this)
.- Нет никакой гарантии, что наблюдаются другие потенциальные нарушения.
Итак, компилятор может использовать перемещения в другом месте, но нет гарантии, что он будет.