2014-03-19 50 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