簡體   English   中英

使用智能指針的好處?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM