第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C+11返回值優(yōu)化還是移動(dòng)?

C+11返回值優(yōu)化還是移動(dòng)?

C++ C
手掌心 2019-07-04 13:31:50
C+11返回值優(yōu)化還是移動(dòng)?我不明白什么時(shí)候該用std::move當(dāng)我應(yīng)該讓編譯器優(yōu)化.。例如:using SerialBuffer = vector< unsigned char >;// let compiler optimize itSerialBuffer read( size_t size ) const{     SerialBuffer buffer( size );     read( begin( buffer ), end( buffer ) );     // Return Value Optimization     return buffer;}// explicit moveSerialBuffer read( size_t size ) const{     SerialBuffer buffer( size );     read( begin( buffer ), end( buffer ) );     return move( buffer );}我該用哪一種?
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊

只使用第一種方法:

Foo f(){
  Foo result;
  mangle(result);
  return result;}

這將已經(jīng)允許使用移動(dòng)構(gòu)造函數(shù)(如果可用的話)。實(shí)際上,局部變量可以綁定到return當(dāng)允許復(fù)制省略時(shí),精確地聲明。

您的第二個(gè)版本積極禁止復(fù)制省略。第一個(gè)版本普遍更好。


查看完整回答
反對 回復(fù) 2019-07-04
?
慕森卡

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊

所有返回值都已經(jīng)moved或者優(yōu)化出,因此不需要顯式地使用返回值移動(dòng)。

編譯器允許自動(dòng)移動(dòng)返回值(優(yōu)化副本),甚至優(yōu)化移動(dòng)!

N 3337標(biāo)準(zhǔn)草案第12.8節(jié)(C+11):

當(dāng)滿足某些條件時(shí),即使對象的復(fù)制/移動(dòng)構(gòu)造函數(shù)和/或析構(gòu)函數(shù)有副作用,也允許實(shí)現(xiàn)省略類對象的復(fù)制/移動(dòng)構(gòu)造。在這種情況下,實(shí)現(xiàn)將省略的復(fù)制/移動(dòng)操作的源和目標(biāo)簡單地視為引用同一個(gè)對象的兩種不同方式,而該對象的銷毀發(fā)生在如果不進(jìn)行優(yōu)化就會(huì)銷毀這兩個(gè)對象的后期。復(fù)制省略,允許在下列情況下(可合并以消除多份副本):

[...]

:

class Thing {public:Thing();
   ~Thing();
   Thing(const Thing&);};Thing f() {
   Thing t;
   return t;}Thing t2 = f();

在這里,可以將省略的條件組合起來,以消除對類的復(fù)制構(gòu)造函數(shù)的兩個(gè)調(diào)用。Thing*復(fù)制本地自動(dòng)對象t到函數(shù)返回值的臨時(shí)對象中。f()以及將該臨時(shí)對象復(fù)制到對象中。t2..有效地,局部對象的構(gòu)造t可以被視為直接初始化全局對象。t2,該物體的破壞將發(fā)生在程序出口。向Thing具有相同的效果,但它是從臨時(shí)對象移動(dòng)到t2那是被剝奪的。-終例 ]

如果符合或?qū)M足復(fù)制操作的省略條件,除非源對象是函數(shù)參數(shù),并且要復(fù)制的對象由lvalue指定,則首先執(zhí)行重載解析,以選擇副本的構(gòu)造函數(shù),就好像該對象是由rvalue指定的一樣。如果重載解析失敗,或者所選構(gòu)造函數(shù)的第一個(gè)參數(shù)的類型不是對象類型的rvalue引用(可能是cv限定的),則再次執(zhí)行重載解析,將對象視為lvalue。


查看完整回答
反對 回復(fù) 2019-07-04
?
萬千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

很簡單。

return buffer;

如果你這樣做,那么NRVO要么會(huì)發(fā)生,要么就不會(huì)發(fā)生。如果它不發(fā)生,那么buffer將被移出。

return std::move( buffer );

如果你這么做,那么NVRO不會(huì)發(fā)生,而且buffer將被移出。

所以使用std::move在這里,還有很多損失。

這條規(guī)則有一個(gè)例外:

Buffer read(Buffer&& buffer) {
    //...
    return std::move( buffer );}

如果buffer是一個(gè)rvalue引用,那么您應(yīng)該使用std::move..這是因?yàn)橐貌环螻RVO的條件,所以沒有std::move它將產(chǎn)生一個(gè)來自lvalue的副本。

這只是“永遠(yuǎn)”這條規(guī)則的一個(gè)實(shí)例。movervalue引用和forward“通用引用”,優(yōu)先于“從不”的規(guī)則。move返回值“。


查看完整回答
反對 回復(fù) 2019-07-04
  • 3 回答
  • 0 關(guān)注
  • 721 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號