[英]The benefits of using a smart pointer?
以這個為例:
#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
已進入堆棧,然后以任何方式復制到堆中。
您根本不需要任何指針,因此智能指針並沒有改進。
通過將資源所有權信息(例如,哪個部分負責釋放資源)附加到變量,智能指針對指針驅動的代碼進行了改進。
使用智能指針的好處是在需要一個指針的情況下不必使用“裸”指針。
因此,這與性能無關:它與程序員對內存管理意識的需求有關,內存管理增加了軟件的復雜性,並可能增加了錯誤和內存泄漏的數量。
如您所說,如果想要避免將數據復制到該函數,則可以使用pass-by-refence ,以便該函數接收對該對象的引用 ,而不是對象的副本。 另外,請注意,這樣做后,對函數內部參數所做的任何更改都將應用於原始調用者。 為了避免這種情況,可以使用const
。
不,addp可能會慢很多,因為它需要堆分配。
多虧了返回值優化(RVO),編譯器仍然可以從原始add函數中優化副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.