执行身份提升有什么开销:: lexical_cast?

时间:2012-09-11 19:13:36

标签: c++ boost lexical-cast

给出如下函数:

template< typename T >
void function1( const T &t )
{
  function2( boost::lexical_cast<std::string>(t) );
}

如果传递给function1的类型已经是std::string,会产生什么样的开销?

开销是否有所不同,具体取决于我lexical_cast的类型?

使重载函数绕过转换是否是多余的? E.g:

void function1( const std::string &t )
{
  function2( t );
}

template< typename T >
void function1( const T &t )
{
  function1( boost::lexical_cast<std::string>(t) );
}

提升的版本可能与您的答案相关,因为据我所知lexical_cast已经在修订版中获得了一些优化。

2 个答案:

答案 0 :(得分:5)

由于文档没有提供关于这个主题的任何内容,我挖掘了lexical_cast源代码(1.51.0)并发现它对类型进行了一些编译时检查并决定了一个特定的“caster类” “那就是转换。如果源和目标相同,这个“施法者类”将只返回输入。

从源(boost/lexical_cast.hpp:2268)伪编码和简化:

template <typename Target, typename Source>
Target lexical_cast(const Source &arg)
{
    static if( is_character_type_to_character_type<Target, src> ||
               is_char_array_to_stdstring<Target, src> ||
               is_same_and_stdstring<Target, src> )
    //         ^-- optimization for std::string to std::string and similar stuff
    {
      return arg;
    }
    else
    {
      /* some complicated stuff */
    }
}

我无法直接看到对其他身份演员的任何优化,并且查看正常选择的lexical_cast_do_cast“施法者类”正在让我的头受伤。 :(

答案 1 :(得分:1)

http://www.boost.org/doc/libs/1_51_0/doc/html/boost_lexical_cast/performance.html

考虑这个链接,字符串到字符串非常快。

所有测试都测量以下代码块10000次迭代的执行速度(以毫秒为单位):

    typedef BOOST_DEDUCED_TYPENAME ::boost::type_traits::ice_or<
            ::boost::detail::is_xchar_to_xchar<Target, src >::value,
            ::boost::detail::is_char_array_to_stdstring<Target, src >::value,
            ::boost::type_traits::ice_and<
                 ::boost::is_same<Target, src >::value,
                 ::boost::detail::is_stdstring<Target >::value
            >::value
    > shall_we_copy_t;

在我们的情况下,shall_we_copy_t::value将成立,因为我们的第3个案例工作(Targetsrc是相同类型,Target类型是{{1} })。

std::basic_string

由于 typedef BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< shall_we_copy_t::value, ::boost::detail::lexical_cast_copy<src >, BOOST_DEDUCED_TYPENAME ::boost::mpl::if_c< shall_we_copy_with_dynamic_check_t::value, ::boost::detail::lexical_cast_dynamic_num<Target, src >, ::boost::detail::lexical_cast_do_cast<Target, src > >::type >::type caster_type; 为真,我们的caster_type将为shall_we_copy_t::value

lexical_cast_copy

因此,将被称为return caster_type::lexical_cast_impl(arg); ,这非常简单

lexical_cast_copy::lexical_cast_impl