3 回答

TA貢獻1874條經驗 獲得超12個贊
Scott,Andrei和Herb 在C ++和Beyond 2011的“ 任何問題”會議上都討論并回答了這個問題。從4:34 開始觀看性能和正確性。shared_ptr
不久,沒有理由按值傳遞,除非目標是共享對象的所有權(例如,在不同的數據結構之間或在不同的線程之間)。
除非您可以按照上面鏈接的視頻中Scott Meyers的說明進行移動優化,但這與您可以使用的C ++的實際版本有關。
在GoingNative 2012會議的“ 互動小組:任何問題!”中對該討論進行了重大更新。值得一看,尤其是從22:50開始。

TA貢獻1799條經驗 獲得超6個贊
這是赫伯·薩特的
準則:除非您要使用或操縱智能指針本身,例如共享或轉讓所有權,否則不要將智能指針作為函數參數傳遞。
準則:表示函數將使用按值shared_ptr參數存儲和共享堆對象的所有權。
準則:僅使用非常量shared_ptr&參數來修改shared_ptr。僅在不確定是否要復制并共享所有權時,才使用const shared_ptr&作為參數。否則,請改用widget *(或者,如果不能為null,則使用widget&)。

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&版本。
- 3 回答
- 0 關注
- 1294 瀏覽
添加回答
舉報