亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們應該按引用還是按值傳遞shared_ptr?

我們應該按引用還是按值傳遞shared_ptr?

C++
慕斯709654 2020-02-03 14:41:31
當一個函數接受shared_ptr(來自boost或C ++ 11 STL)時,是否要傳遞它:通過const參考: void foo(const shared_ptr<T>& p)或值:void foo(shared_ptr<T> p)?我更喜歡第一種方法,因為我懷疑它會更快。但這真的值得嗎?還是有其他問題?請問您提供選擇的理由,或者如果是這樣的話,為什么您認為這沒有關系。
查看完整描述

3 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

Scott,Andrei和Herb 在C ++和Beyond 2011的“ 任何問題”會議上都討論并回答了這個問題。從4:34 開始觀看性能和正確性。shared_ptr


不久,沒有理由按值傳遞,除非目標是共享對象的所有權(例如,在不同的數據結構之間或在不同的線程之間)。


除非您可以按照上面鏈接的視頻中Scott Meyers的說明進行移動優化,但這與您可以使用的C ++的實際版本有關。


在GoingNative 2012會議的“ 互動小組:任何問題!”中對該討論進行了重大更新。值得一看,尤其是從22:50開始。


查看完整回答
反對 回復 2020-02-03
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

這是赫伯·薩特的


準則:除非您要使用或操縱智能指針本身,例如共享或轉讓所有權,否則不要將智能指針作為函數參數傳遞。


準則:表示函數將使用按值shared_ptr參數存儲和共享堆對象的所有權。


準則:僅使用非常量shared_ptr&參數來修改shared_ptr。僅在不確定是否要復制并共享所有權時,才使用const shared_ptr&作為參數。否則,請改用widget *(或者,如果不能為null,則使用widget&)。


查看完整回答
反對 回復 2020-02-03
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我跑到下面的代碼,一旦與foo服用shared_ptr的const&,并再次foo取shared_ptr的值。


void foo(const std::shared_ptr<int>& p)

{

    static int x = 0;

    *p = ++x;

}


int main()

{

    auto p = std::make_shared<int>();

    auto start = clock();

    for (int i = 0; i < 10000000; ++i)

    {

        foo(p);

    }    

    std::cout << "Took " << clock() - start << " ms" << std::endl;

}

在我的Intel Core 2 Quad(2.4GHz)處理器上使用VS2015,x86版本構建


const shared_ptr&     - 10ms  

shared_ptr            - 281ms 

按值復制版本要慢一個數量級。

如果要從當前線程同步調用函數,請選擇const&版本。


查看完整回答
反對 回復 2020-02-03
  • 3 回答
  • 0 關注
  • 1294 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號