假设我们有类型 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++ 函数(例如,通过引用接受参数)非常好。
关于c++ - 没有内存拷贝的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909981/