Прежде всего, я хотел бы отметить, что в конструкторах перемещения или присваивании перемещения ничего не должно бросаться и, похоже, в этом нет необходимости. Единственное, что нужно сделать в конструкторах/операторах присваивания, это иметь дело с уже выделенной памятью и указателями на них. Обычно вы не должны вызывать какие-либо другие методы, которые могут вызывать броски, и ваше собственное перемещение внутри вашего конструктора/оператора не нуждается в этом. Но, с другой стороны, простой вывод отладочного сообщения нарушает это правило.
Оптимизация может быть выполнена различными способами. Автоматически компилятором, а также различными реализациями кода, использующими ваши конструкторы и оператор присваивания. Взгляните на STL, есть некоторые специализации для кода, которые отличаются, если вы используете исключения или нет, которые реализуются через признаки типа.
Сам компилятор может лучше оптимизировать, имея при этом гарантию, что какой-либо код никогда не выбрасывал. У компилятора есть гарантированное дерево вызовов через ваш код, который можно лучше встроить, рассчитать время компиляции или что-то в этом роде. Минимальная оптимизация, которую можно сделать, заключается в том, чтобы не хранить всю информацию о фактическом кадре стека, которая необходима для обработки условия броска, например, переменные освобождения в стеке и другие вещи.
Тут тоже возник вопрос: noexcept, раскрутка стека и производительность
Может быть, ваш вопрос дублирует этот?
Возможно, полезный вопрос, связанный с этим, я нашел здесь: Являются ли конструкторы перемещения должно быть noexcept? Здесь обсуждается необходимость добавления операций перемещения.
Какова цель noexcept здесь?
Минимальная экономия некоторого программного пространства, которое относится не только к операциям перемещения, но и ко всем функциям. И если ваш класс используется с контейнерами или алгоритмами STL, он может обрабатываться по-разному, что может привести к лучшей оптимизации, если ваша реализация STL использует эту информацию. И, возможно, компилятор сможет улучшить общую оптимизацию из-за известного дерева вызовов, если все остальные вещи будут постоянными во времени компиляции.
person
Klaus
schedule
26.08.2015