我正在閱讀Stroustrup的 "Tour of C v2"。這當然不是一本C 初學者的書,但是很有趣。
我在谷歌上搜索了一下,并翻閱了SO,但在這個問題上沒有收獲。
現在,我以為我理解了編譯器何時可以利用移動建構式,但顯然我沒有理解。這里我展示了移動建構式和我認為會使用它的函式。它并沒有。只有在我明確使用std::move的情況下。這是為什么呢?我的理解是,本地r將在回傳時被隱式 "移動"。
template<typename T>
Vector<T>::Vector(Vector<T> && a) // move constructor
:elem{a.elem},sz{a.sz}{
a.elem=nullptr。
a.sz=0;
}
template<typename T>
Vector<T> moveVectorAfterAdd(const Vector< T> & v1, const Vector< T> & v2){
Vector<T> r = v1 v2。
return std::move(r)。
//return r;。
}
int main(void) {
Vector<double> v1(1)。
Vector<double> v2=v1。
Vector<double> v3=v2。
Vector<double> v4=moveVectorAfterAdd(v1,v2)。
return 0。
(順便提一下,如果我沒有真正使用std::move,ldb甚至不會讓我在move建構式中設定斷點,盡管編譯時沒有優化。)
很高興收到任何和所有澄清!
uj5u.com熱心網友回復:
什么時候需要明確呼叫std::move,什么時候不需要在cpp中呼叫?
簡而言之,用技術上的精確的話來說。當你有一個你想成為r值的l值時,使用std::move。更實際的是。當有一個你想成為移動的拷貝時,你會想這樣做。因此被稱為std::move。
在這個例子中,你回傳一個自動變數。沒有任何拷貝可以通過使用std::move來避免,因為在回傳一個自動變數的特殊情況下,即使從一個lvalue也會有一個移動。
在這里我展示了移動建構式和我認為會使用它的函式。它并沒有。
僅僅因為抽象機中有一個移動,并不意味著會有對移動建構式的呼叫。這是一件好事,因為什么都不做有可能比呼叫移動建構式更快。
這就是所謂的(命名)回傳值優化。或者更普遍的是拷貝消除。使用 std::move 抑制了這種優化,因此在這種情況下,它不僅是不必要的,而且也是反作用的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314121.html
標籤:
