C++ 没有内存拷贝的运算符重载

C++ 没有内存拷贝的运算符重载,c++,memory-management,operator-overloading,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语言中,我们只需将指针传递给函数,它就会将它们准确地存储在我们想要的位置,而无需任何中间分配/复制: v

假设我们有一个类型
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函数以避免中间分配/复制


谢谢

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

在C++-11中,查找右值引用,以获取有关如何提供更多关于临时变量将被省略的保证的信息


无论哪种方式,都不需要编写C函数。C++函数(例如,通过引用来接受参数)是完全正确的。< /p> @桑德尔代克,对不起,我不明白。你能更清楚地表达自己吗?如果你写
acc=A-b
c对象肯定只会初始化一次。