给出如下函数:
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
已经在修订版中获得了一些优化。
答案 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个案例工作(Target
和src
是相同类型,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