2

任意の型Tをコピーまたはconst-referenceのどちらで渡すかを決定する方法が必要です(たとえば、Tが十分に小さい場合はコピーし、そうでない場合はconst-referenceで渡します)。車輪の再発明を避けるために、私はBoostCallTraitsを試しました。

予想どおり、プリミティブ型は値で渡され、のような複合型std::stringは参照で渡されます。ただし、小さな非プリミティブ型も参照によって渡されます。たとえば、std::pair<char, char>これは最良の選択ではないようです。sizeof(void*)私は、それまでのすべてが値によって渡されると仮定しました。

一般的に、Boostライブラリは高品質であるため、何かが足りない可能性があります。

これが私のテストコードです:

#include <iostream>
#include <type_traits>
#include <tuple>
#include <boost/call_traits.hpp>

template <typename TYPE>
void test(const char* type_name)
{
  typedef typename boost::call_traits<TYPE>::param_type T;  
  if(std::is_reference<T>::value)        
    std::cout << type_name << " is passed by reference (sizeof=" << sizeof(TYPE) << ")\n"; 
  else 
    std::cout << type_name << " is passed by value (sizeof=" << sizeof(TYPE) << ")\n"; 
}

int main()
{
  test<short>("short");
  test<int>("int");
  test<double>("double");
  test<std::string>("std::string");
  test<long long>("long long");
  test<std::pair<int, int>>("std::pair<int, int>");
  test<std::pair<short, short>>("std::pair<short, short>");
  test<std::pair<char, char>>("std::pair<char, char>");
  test<std::tuple<char, char>>("std::tuple<char, char>");
  test<std::tuple<char, char, char, char>>("std::tuple<char, char, char, char>");
  test<std::pair<long long, long long>>("std::pair<long long, long long>");
  return 0;
}

結果は次のとおりです(Boost 1.50、g ++ 4.7.2):

short is passed by value (sizeof=2)
int is passed by value (sizeof=4)
double is passed by value (sizeof=8)
std::string is passed by reference (sizeof=8)
long long is passed by value (sizeof=8)
std::pair<int, int> is passed by reference (sizeof=8)
std::pair<short, short> is passed by reference (sizeof=4)
std::pair<char, char> is passed by reference (sizeof=2)
std::tuple<char, char> is passed by reference (sizeof=2)
std::tuple<char, char, char, char> is passed by reference (sizeof=4)
std::pair<long long, long long> is passed by reference (sizeof=16)
4

1 に答える 1

0

Call Traitsはジェネリックライブラリであり、ユーザー定義型で機能する必要があります。任意の型を値で渡す方が速いかどうかを判断するには、ライブラリの範囲を超える追加の知識が必要です。したがって、疑わしい場合は常に値を渡すという保守的なアプローチが合理的です。

これを拡張して、一般的に使用されるSTLタイプ(たとえば、、、)のサポートを改善することは可能std::pairですがstd::tuplestd::array一般的な方法はありません。

于 2012-11-17T13:58:30.493 に答える