gpt4 book ai didi

c++ - 在进行添加时如何使用 C++ 模板避免临时对象?

转载 作者:行者123 更新时间:2023-11-30 03:58:30 24 4
gpt4 key购买 nike

<分区>

我正在阅读 article托马斯·阿尔塞。文章讨论了通过使用模板提高 vector 加法性能。但是有些部分我跟不上。

作者说下面的代码可以避免在求值的时候产生临时对象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

附言在@Severin Pappadeux 提供的第二个链接中,解释很容易理解。基本上,所有表达式模板所做的是:通过重载运算符 + 它甚至不执行加法而是创建一个轻量级对象,其主要工作是在运算符的每一侧保存对两个操作数的两个引用+,加法是在运算符=求值时完成的。通过第二次重载运算符 +(因为左侧是轻量级对象,右侧是 vD),对轻量级对象的引用(它包含之前的两个可以创建对 vBvC) 和 vD 的引用,并且在评估运算符 = 时再次完成添加>.

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com