Какие накладные расходы существуют при выполнении повышения личности :: lexical_cast?

Учитывая функцию, такую ​​как:

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

Какие накладные расходы возникают, если тип передан function1 уже std::string?

Различаются ли накладные расходы в зависимости от типа lexical_cast-в к?

Излишне ли делать перегруженную функцию для обхода приведения? Например.:

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

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

Версия boost может быть подходящей для вашего ответа, так как я понимаю, что lexical_cast получил несколько оптимизаций через ревизии.

5

Решение

Поскольку в документации ничего не предлагается по этой теме, я покопался в lexical_cast source (1.51.0) и обнаружил, что он выполняет некоторую проверку типов во время компиляции и определяет конкретный «класс заклинателя», который выполняет преобразование. Если источник и цель совпадают, этот «класс заклинателя» просто вернет ввод.

Псевдо-кодифицированный и упрощенный от источника (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 «Кастер класс» причиняет мне боль в голове. 🙁

5

Другие решения

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 тип 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;

Поскольку, shall_we_copy_t::value верно, наш caster_type будет lexical_cast_copy

return caster_type::lexical_cast_impl(arg);

Итак, будет называться lexical_cast_copy::lexical_cast_implчто очень просто

    template <typename Source>
struct lexical_cast_copy
{
static inline Source lexical_cast_impl(const Source &arg)
{
return arg;
}
};
1

По вопросам рекламы [email protected]