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

标签 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 函数以避免中间分配/复制?

谢谢

最佳答案

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

在 C++-11 中,查找右值引用以获取有关如何提供更多保证临时对象将被删除的信息。

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

关于c++ - 没有内存拷贝的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909981/

相关文章:

c++ - 封装ublas并重载对operator()的const引用

C++ 基类型到指针的转换

c - 释放包含 void * 的结构

c++ - 如何摆脱丑陋的记录

c++ - 重载输入基类里面重载输入派生类

c++ - 使用自定义类的 C++ STL 映射的运算符重载

c++ - =delete 方法上的限定符

c - 嵌入式系统上分层通信堆栈的内存管理

iphone - UIWebView 加载 .RTF 文件时泄漏内存?

C++ 插入映射<double, multimap<int, Object*>>