2015-06-18 203 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++函數(例如,通過引用接受參數)非常好。