2012-09-11 38 views
5

給定功能,如:執行身份驗證boost :: lexical_cast有什麼開銷?

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

如果傳遞給function1類型已經是std::string什麼樣的開銷招致?

是否開銷不同,取決於我的類型lexical_cast -ing to?

讓一個重載函數繞過演員是多餘的嗎?例如: -

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已經跨越修訂進行了一些優化。

+3

首先,不要讓一個函數模板專門化,*只是超載*。 – Xeo

+0

@Xeo好點[這裏解釋](http://stackoverflow.com/questions/7108033/template-specialization-vs-function-overloading)。編輯。 –

回答

4

由於文檔沒有提供關於此主題的任何內容,因此我深入瞭解了源代碼(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「腳輪類」是使任何優化我頭疼。 :(

+0

@Drew:「我無法直接看到其他身份轉換的優化,儘管」 - 這只是返回參數。 – Xeo

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將是真實的,因爲我們的第三個案例工作(Targetsrc是相同的類型和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; 
     } 
    };