C 函式返回區域性變數的std move 問題?

時間 2021-05-05 15:34:13

1樓:BinGostar

我理解的是"避免拷貝"和move是兩個東西"避免拷貝"是編譯器的優化方式,move是告訴編譯器按照移動語義函式去執行來避免拷貝

當然大多時候,不管是否使用move,編譯器都會優化來避免拷貝clang很人性,告訴你這是不必要的,g++不管那麼多,一把梭有時候以為自己程式設計技術的突飛猛進,實際上是編譯器的進步

2樓:暮無井見鈴

return statement

Copy elision - cppreference.com關於 @神奇先生 的答案個人認為有些地方可以補充。

首先 URVO 在 C++17 是強制的。不過 NRVO 不是強制,意味著有時不這麼優化也是允許的。

其次,若 return 的表示式是符合返回型別的左值,且編譯器沒有進行複製省略,那麼標準(C++11 開始)也要求編譯器先試圖把表示式當右值,優先匹配移動建構函式(再匹配通常的複製建構函式),若失敗的話則再將其當左值,匹配接受非 const 引用的複製建構函式。

所以按照標準,上面的 std::move(a) 是不必要的(除非你希望強制呼叫移動建構函式),編譯器在必要時會做同樣的處理。

3樓:夏之幻想

符合規範,這裡是說可能會影響copy elision優化,不過不是什麼大問題

關於copy elision: http://en.cppreference.com/w/cpp/language/copy_elision

4樓:d41d8c

clang 只是想告訴你這是 premature pessimization。錯倒是沒錯的。

如果你想強制要求編譯器呼叫移動建構函式,而不是把這個過程優化掉,這麼寫是毫無問題的。

請問C 函式的區域性變數和引數哪個先被刪除?

徐聖 C param 讀讀它你就明白了 區域性變數先滾蛋,引數其實是在呼叫者的棧上呢,最後銷毀。怎麼定址到引數呢,棧幀基址往高位址加就行了。其實GCC最後一步銷毀引數一般都省略不做,因為下次使用到這塊記憶體時會覆蓋掉了。 旺旺 根據C 2003標準文件第5.2.2節第4項的規定 引數的構造與析構發生...

c 用new開闢到堆區的區域性變數的指標可以返回嗎?

可以,但是不方便。因為這意味著釋放記憶體的責任丟給了呼叫方。每個呼叫方都得記得用完之後釋放記憶體。一旦忘記就是記憶體洩露。這可不是什麼好事。另外,大部分常見的類似需求都已經被STL裡面的容器承包了。生產環境下面應該優先考慮他們。 阿莫小西林 首先需要明確乙個概念,區域性變數是位於棧區的,new出來的...

為什麼全域性變數和區域性變數的答案會不一樣,用C Free執行?

Xinyu Tan 我沒仔細看程式因為我覺得你的程式的行為是不可預期的。原因在於 char a 1003 沒有初始化。裡面的內容是隨機的。當你用strlen a 去計算字串 a的長度時計算結果是根據陣列a裡第乙個0值的位置決定的。由於陣列a裡的內容隨機所以 int c strlen a 中 c的值是...