Не влияет ли спецификация swap на производительность? - PullRequest
4 голосов
/ 31 августа 2011

Спецификация 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 не исключают разные вещи? Кроме того, это влияет на производительность?

1 Ответ

3 голосов
/ 31 августа 2011

В дополнение к коду, который ведет себя по-разному, когда что-то не является исключением (например, std::vector), объявление функции noexcept может позволить компилятору выполнять свои собственные оптимизации. По крайней мере, компилятору не нужно отслеживать определенные вещи, которые участвуют в обработке исключений, которые могут освобождать регистры или выполнять меньше инструкций среди прочего.

...