3 回答

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

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

TA貢獻(xiàn)1835條經(jīng)驗 獲得超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版本構(gòu)建
const shared_ptr& - 10ms
shared_ptr - 281ms
按值復(fù)制版本要慢一個數(shù)量級。
如果要從當(dāng)前線程同步調(diào)用函數(shù),請選擇const&版本。
- 3 回答
- 0 關(guān)注
- 1304 瀏覽
添加回答
舉報