나는 Tomas Arce가 article을 읽고 있습니다. 이 기사에서는 템플릿을 사용하여 벡터 추가 성능을 향상시키는 방법에 대해 설명합니다. 그러나 내가 따라 올 수없는 부분들.추가 할 때 C++ 템플릿을 사용하여 임시 개체를 피할 수있는 방법은 무엇입니까?
저자는 vA = vB + vC + vD
을 평가할 때 다음 코드가 임시 개체 생성을 피할 수 있다고 말합니다. 나는 임시적인 물체가 어떻게 피할 수 있는지 얻지 못했다. 내부 메커니즘을 설명 할 수있는 누군가가 템플릿을 사용할 때 임시 객체를 피할 수있는 방법이 있습니까?
template< class ta_a >
class vecarg
{
const ta_a& Argv;
public:
inline vecarg(const ta_a& A) : Argv(A) {}
inline const float Evaluate(const int i) const
{ return Argv.Evaluate(i); }
};
template<>
class vecarg< const float >
{
const ta_a& Argv;
public:
inline vecarg(const ta_a& A) : Argv(A) {}
inline const float Evaluate(const int i) const { return Argv; }
};
template<>
class vecarg< const int >
{
const ta_a& Argv;
public:
inline vecarg(const ta_a& A) : Argv(A) {}
inline const float Evaluate(const int i) const { return (float)Argv; }
};
template< class ta_a, class ta_b, class ta_eval >
class vecexp_2
{
const vecarg<ta_a> Arg1;
const vecarg<ta_b> Arg2;
public:
inline vecexp_2(const ta_a& A1, const ta_b& A2)
: Arg1(A1), Arg2(A2) {}
inline const float Evaluate (const int I) const
{ return ta_eval::Evaluate(i, Arg1, Arg2); }
};
// Listing 5
P. @Severin Pappadeux가 제공하는 두 번째 링크에서 설명은 쉽게 이해할 수 있습니다. 기본적으로 모든 식 템플릿은 다음과 같습니다. 오버로드 연산자 +
은 추가 작업을 수행하지 않고 대신 기본 작업이 연산자 +
의 각 측면에있는 두 피연산자에 대한 두 개의 참조를 보유하고 있고 추가가 완료된 경량 개체를 만듭니다 운영자 =
을 평가할 때. +
두 번째로 (왼손잡이는 가벼운 객체이고 오른쪽은 vD
이므로) 두 개의 이전 참조 (vB
및 vC
) 및 vD
에 대한 참조를 만들고 다시 만들 수 있습니다. 오퍼레이터 =
을 평가할 때 추가가 완료됩니다.
'vA = vB + vC + vD'코드는 어디에 있습니까? –
코드 샘플을 [MCVE] (http://stackoverflow.com/help/mcve)로 만들 수 있습니까? 실제 양식에서는 [코드 샘플] (http://ideone.com/RVn1Qc)이 적합하지 않습니다. –
이것은 거대한 기사 (OP 링크 된)의 단지 작은 부분입니다. MCVE가 없습니다. –