为什么我的swap <string,string>比std版本慢得多?

时间:2017-02-06 20:45:54

标签: c++ performance c++11

这是我的C ++代码:

inline static void swap(std::string& a1, std::string& a2) {    
    std::string temp( std::move(a1));
    a1 = std::move( a2 );
    a2 = std::move( temp );
}

我运行此功能1000000次,平均需要78ms,但std只花了13ms。我只是看了std::swap的实现,我发现它和我的一样,所以为什么我这么慢?

1 个答案:

答案 0 :(得分:6)

根据标准§21.3.2.8/ p1 swap [string.special] Emphasis Mine ):

template<class charT, class traits, class Allocator>
void swap(basic_string<charT, traits, Allocator>& lhs,
basic_string<charT, traits, Allocator>& rhs)
noexcept(noexcept(lhs.swap(rhs)));
     

1 效果:相当于:lhs.swap(rhs);

因此,std::swap专门化/具有std::string的重载,相当于调用成员函数std::basic_string::swap

可能的实施方式是:

template<class Elem, class Traits, class Alloc> 
inline
void
swap(std::basic_string<Elem, Traits, Alloc>& left, 
     std::basic_string<Elem, Traits, Alloc>& right) noexcept(noexcept(left.swap(right))) {
  left.swap(right);
}

至于为什么你的实现速度较慢,我的猜测是,即使你将一个字符串移动到另一个字符串,仍然会调用临时字符串的析构函数。在上面的STL兼容实现中并非如此。