2014-03-19 82 views
1

以此作爲一個例子:使用智能指針的好處?

#include <memory> 
#include <iostream> 

int add(int a, int b) { 
    return a+b; 
} 

std::unique_ptr<int> addp(int a, int b) { 
    std::unique_ptr<int> ip(new int(a + b)); 
    return ip; 
} 

int main(int argc, char const* argv[]) 
{ 
    std::cout << add(3, 5) << std::endl; 
    std::cout << *(addp(3, 5)) << std::endl; 
    return 0; 
} 

不函數ADDP得到任何改善性能自動,或換句話說,不它 避免數據的拷貝在所有?我懷疑結果a+b是 得到了堆棧,然後以任何方式複製到堆。

+2

在這種情況下,來自'new'的內存分配可能會比根本不使用指針更糟糕。也就是說,使用'unique_ptr'比使用'new'和原始指針更安全,維護更少。 – YoungJohn

回答

3

不,addp可能會慢很多,因爲它需要堆分配。

歸功於返回值優化(RVO),編譯器可能會優化拷貝出原來的add函數。

6

這裏你根本不需要任何指針,所以智能指針並不是一個改進。

智能指針通過將資源所有權信息(例如哪個部分負責釋放資源)附加到變量來改進指針驅動的代碼。

6

使用智能指針的好處是不必使用「裸」指針in the case of needing one。因此,這與性能無關:它與程序員意識到內存管理的需要有關,這增加了軟件的複雜性,可能增加了錯誤和內存泄漏的數量。

如果你想,如你所說,爲了避免數據的功能的複製,你可以使用pass-by-refence,使接收功能,而不是它的一個副本參考對象。此外,請注意,通過這樣做,對功能內的參數所做的任何更改將會被應用到原始呼叫者。爲了避免這種情況,您可以使用const