Спецификация noexcept
для конструкторов перемещения, как известно, влияет на производительность в C ++ 0x. Например, std::vector<T>::resize
, std::vector<T>::reserve
может использовать не-бросающий конструктор перемещения T, если доказано, что он не бросает. Оператор noexcept
- это способ проверить это свойство во время компиляции. Если noexcept говорит, что move-ctor T не выбрасывает, объекты T будут перемещаться, а не копироваться, что, скорее всего, приведет к более высокой производительности.
Мой вопрос касается обмена членами или обмена на уровне имен для пользовательского класса T. Спецификация C ++ 0x затрачивает некоторые усилия на экспорт, кроме спецификаций std::pair
, std::tuple
, std::array:swap
, возможно, указывающих на то, что пользователь -определенные классы должны пытаться использовать тот же принцип. Например, std::pair::swap
объявлен как эквивалент:
void std::pair::swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second));
В основном это говорит о том, что своп пары будет выброшен, если либо поменяется first
, либо second
броском члена. У свопов first
, second
могут быть свои собственные, кроме спецификаций с точки зрения их членов.
Наконец, вопрос: существуют ли общие алгоритмы (в stl или в другом месте), которые в зависимости от спецификации swap не исключают разные вещи? Кроме того, это влияет на производительность?