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

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

C+11返回值優化還是移動?

C+11返回值優化還是移動?

C++ C
手掌心 2019-07-04 13:31:50
C+11返回值優化還是移動?我不明白什么時候該用std::move當我應該讓編譯器優化.。例如: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貢獻1744條經驗 獲得超4個贊

只使用第一種方法:

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

這將已經允許使用移動構造函數(如果可用的話)。實際上,局部變量可以綁定到return當允許復制省略時,精確地聲明。

您的第二個版本積極禁止復制省略。第一個版本普遍更好。


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

TA貢獻1806條經驗 獲得超8個贊

所有返回值都已經moved或者優化出,因此不需要顯式地使用返回值移動。

編譯器允許自動移動返回值(優化副本),甚至優化移動!

N 3337標準草案第12.8節(C+11):

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

[...]

:

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

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

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


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

TA貢獻1891條經驗 獲得超3個贊

很簡單。

return buffer;

如果你這樣做,那么NRVO要么會發生,要么就不會發生。如果它不發生,那么buffer將被移出。

return std::move( buffer );

如果你這么做,那么NVRO不會發生,而且buffer將被移出。

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

這條規則有一個例外:

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

如果buffer是一個rvalue引用,那么您應該使用std::move..這是因為引用不符合NRVO的條件,所以沒有std::move它將產生一個來自lvalue的副本。

這只是“永遠”這條規則的一個實例。movervalue引用和forward“通用引用”,優先于“從不”的規則。move返回值“。


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 739 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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