5

次のような関数が与えられます:

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) );
}

lexical_castブーストのバージョンは、リビジョン間でいくつかの最適化を受けていることを理解しているので、あなたの答えに関連している可能性があります。

4

2 に答える 2

5

ドキュメントにはこのトピックに関する情報が何も記載されていないため、lexical_castソース(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 */
    }
}

ただし、他のIDキャストの最適化を直接確認することはできません。通常選択されているlexical_cast_do_cast「キャスタークラス」を調べると、頭が痛くなります。:(

于 2012-09-11T19:42:30.193 に答える
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タイプはです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;

がtrueであるため、shall_we_copy_t::valuecaster_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;
        }
    };
于 2012-09-11T19:44:20.907 に答える