想象一下,我们有类型A
,我们想要执行以下操作:
A operator -(const A& a, const A& b)
{
A c;
//...
return c;
}
当我们调用此运算符时,我们会执行以下操作:
A c;
c = a - b;
基本上我们分配c
两次(在调用运算符之前和运算符内部)然后将其值复制到运算符之外的主代码上的变量。在C中,我们可以将指针传递给函数,并将它们准确地存储在我们想要的位置,而无需任何中间分配/复制:
void sub(A* a, A* b, A* c);
是否可以对运算符重载执行相同操作,还是必须将其作为C函数实现以避免中间分配/复制?
由于
答案 0 :(得分:1)
在C ++ 11之前,它取决于你的编译器。标准允许但不要求编译器消除(或消除)临时性,其中检测其存在的唯一方法是跟踪构造函数和析构函数调用。这是允许这种情况的一种情况。
在C ++ - 11中,查找右值参考,以获取有关如何提供更多保证临时性将被省略的信息。
无论哪种方式,都没有必要编写C函数。 C ++函数(例如,通过引用接受参数)非常好。