[英]How move constructor works in C++?
我已經閱讀了很多關於移動構造函數的文章(甚至在堆棧上),但是我沒有找到關於它是如何工作的確切解釋(如果轉移指針指向臨時對象並且如果此臨時變量及其地址在遇到時將被銷毀則保存“)”)。
這是一個簡單的例子
#include <iostream>
#include <vector>
using namespace std;
class boVector {
private:
int size;
public:
boVector() {};
boVector(const boVector& rhs) { cout << "copy Ctor." << endl; }
boVector(boVector&& rhs) { cout << "move Ctor." << endl; }
};
void foo(boVector v) {}
boVector createBoVector() { return boVector(); }
int main()
{
//copy
boVector reausable = createBoVector();
foo(reausable);
//move
foo(std::move(createBoVector()));
return 0;
}
所有人都說移動Ctor是淺拷貝副本或只是一個指針賦值。 但是,如何使用指向臨時對象的指針啟動我的對象(當此對象將被破壞時,我的對象將指向一個未知地址,從我的角度來看這是無效的)。
用指針地址啟動變量是不對的,在滿足“)”后它將不再存在。
請問是否可以有人解釋我如何在內存中查找此臨時變量以及如何將臨時對象的地址分配給我當前的一個並且此操作是有效的。
“移動構造函數”並不神奇 - 它是一個采用右值引用的構造函數。
Rvalue引用綁定到臨時對象,並具有即將到期的某些東西的“含義”,並且稍后將無法在程序中訪問:這使開發人員能夠根據指針交換或類似方式實現資源保留類的移動快速操作。
你的boVector
類實際上不能從移動語義中獲得任何好處,因為它只存儲一個int
並且不包含任何資源。 移動int
與復制int
一樣快。
在里面
foo(std::move(createBoVector()));
表達式, std::move
是多余的,因為createBoVector()
已經是一個右值 。
考慮:
foo(createBoVector());
這將調用boVector(boVector&&)
因為它比boVector(const boVector&)
更好。
由createBoVector()
創建的實例將在表達式的整個持續時間內生效 - 這意味着rvalue引用將在boVector(boVector&&)
的持續時間內指向有效對象。
所有人都說移動Ctor是淺拷貝副本或只是一個指針賦值。
並非所有人都這么說,因為事實並非如此。 移動構造函數是您定義它的原因。 在您的示例中,您的移動ctor完全做了其他事情。 移動ctor - 與復制ctor相反 - 是你知道另一個對象即將被銷毀,所以你可以蠶食或移動它的資源。
移動構造函數可以制作“淺拷貝”,盡管該術語是口語而不是在C ++中定義明確。 “只是一個指針分配” - 也許,有時可能。
但是,如何使用指向臨時對象的指針啟動我的對象(當此對象將被破壞時,我的對象將指向一個未知地址,從我的角度來看這是無效的)。
您(通常)不會使用類型為T*
的指針初始化類型為T
的對象。 您可以指定my_t = *my_t_ptr
,或者如果您知道可以“蠶食” my_t_ptr
指向的T
,因為它很快就會被刪除,那么您可以指定my_t = std::move(*my_t_ptr)
。
你能給我一個更相關的例子[移動構造函數和復制構造函數之間有意義的區別] ......?
“經典”示例是通過在堆上分配一些空間來構造T
當你從另一個T
復制構造一個T
時,你別無選擇,只能分配第二段內存; 當你移動構造一個T
,你可以:1。 將指針從現有T
復制到正在構建的T
2.將現有T
的成員指針設置為nullptr
。 在這種情況下,您只使用一個T
的堆棧空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.