2015-06-18 165 views
1

假设我们有型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函数来实现,以避免中间分配/复制?

谢谢

+3

http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization –

+0

@SanderDeDycker对不起,我无法理解。你能更清楚地表达自己吗? – fc67

+1

如果你写'A c = a - b;''''''''''c'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' –

回答

1

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

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

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