运算符重载没有内存副本

时间:2015-06-18 08:17:10

标签: c++ memory-management operator-overloading

想象一下,我们有类型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函数实现以避免中间分配/复制?

由于

1 个答案:

答案 0 :(得分:1)

在C ++ 11之前,它取决于你的编译器。标准允许但不要求编译器消除(或消除)临时性,其中检测其存在的唯一方法是跟踪构造函数和析构函数调用。这是允许这种情况的一种情况。

在C ++ - 11中,查找右值参考,以获取有关如何提供更多保证临时性将被省略的信息。

无论哪种方式,都没有必要编写C函数。 C ++函数(例如,通过引用接受参数)非常好。