C 11 的move語義,從語言功能正交性來看,是一種必須的語義嗎?

時間 2021-05-30 00:28:58

1樓:圓形畢露

Move語意不是必須的,它的作用是為了提高程式效率

Move語意和右值有關,在C++11中,編譯器能夠根據函式引數是左值還是右值決定呼叫copy constructor還是move constructor。

右值從狹義上說就是沒有identity的表示式,比如匿名物件,通過隱式轉換的物件... 這些統稱為prvalue;實際上還有xvalue,最常見的xvalue就是std::move轉換後的物件(返回T&&型別)。

我認為普通的自定義型別是不需要move的,需要move語意的是需要管理資源的類。

比如下面的自定義String類:

class

String

~String

()m_size=0

;}String

(const

String

&str

)private

:char

*m_data

;int

m_size;};

如果所有的臨時物件都通過拷貝的方式傳遞,效能上就太不友好了。這時我們可以定義乙個move constructor:

String

(String

&&str

)這樣就不需要分配新的空間了,只需要呼叫move constructor將臨時變數的內容「偷過來」。

2樓:Rich

move其實就是一種型別轉換,可以用static_cast替換template

struct RemoveRef

;template

typename RemoveRef::Type&& Move(T&& value)

3樓:Alan Li

不是唯一必須的語義。move可以用別的語句代替, 它是多個語句的聚合。可以這樣想:

C++已經是乙個圖靈完備的語言,既然所有圖靈機上的操作都能用C++表示出來,於是新加入的語句肯定不會是在這個空間裡正交的。

Move的出現是因為:C++編譯器對移動操作的優化很有限,Move是從語言和編譯器的角度去設計的,為了讓語言更容易使用和提高優化器的效率。

至於為什麼可以提高優化器的優化交率,這裡摘一段話:「In C++03, ... there was no way to tell if an object was a temporary or not, you had to run the same code in the assignment operator or copy constructor, no matter where the value came from, so no pilfering was possible.

In C++11, the answer is--you can!」

意思是在C++11之間我們不能告訴乙個編譯器某個變數是不是臨時的。如果語言告訴編譯器更多的資訊,讓它知道這是乙個臨時變數,編譯器可以有各種方法優化不必要的初始化和copy等操作。

此段話抄自:

這是一篇關於move語句的很不錯的介紹和解釋的文章,既然它講得比我要好,我就不多說了。

C 11中的move語義減少了臨時物件和物件複製嗎?

槓吐血評論員陶某 move應該是針對你的物件中有在堆上分配記憶體這種情況而設定的,你舉的例子恰好不符合這種情況。看下面這個例子 classA A A A other A operator A other return this int p int main A中有堆上分配的變數p時,呼叫move語義...

C語言有 move 語義嗎?

yc znone C語言沒有物件,沒有引用,也就不存在移動語義了。C語言只有資料和指標。C 的移動語義指的是所有權和資料從源物件轉移到目的物件,源物件復位。移動語義基於RAII 複製和右值引用擴充套件來的,用在兩個方面 1.可以複製但複製成本高的物件,可以使用移動操作避免複製成本。2.不可以複製但可...

怎樣從C 11轉型到C 17 20?

歐文韜 c 14和c 17基本上增加的都是語法醣類的工具呀。你就自然地用唄,等碰上問題,發現c 17剛好有解決方案的語法糖,誒就看懂了。 Jason於航 緩和點 先按照 11 和 14 的語法寫,然後再做漸進增強,說白了就是重構。重構遵循從小到大原則,先改小 feature,再考慮大模式。激進點 直...