簡體   English   中英

C++ std::move() 性能明智的左值

[英]C++ std::move() performance wise with lvalues

我剛剛學習完左值、右值、移動構造函數和移動運算符。 我可以看到使用具有值性能和可用性的移動構造函數的附加值。 但是我看不到使用帶有值性能的移動構造函數的移動運算符的附加值,肯定有一個附加值可用性明智,但我們不能使用其他一些技術(例如指針)為左值實現相同的功能。 所以我的問題是:使用帶有值性能的移動構造函數的移動運算符的附加值是什么。 感謝您閱讀我的問題。

例子:

class string{
public:
char* data;

string(){
    data = nullptr;
}

string(const char* p)
{
    size_t size = std::strlen(p) + 1;
    data = new char[size];
    std::memcpy(data, p, size);
}

 ~string()
{
    delete[] data;
}

string(const string& that)
{
    size_t size = std::strlen(that.data) + 1;
    data = new char[size];
    std::memcpy(data, that.data, size);
}

string(string&& that)
{
    data = that.data;
    that.data = nullptr;
}

string movee(string &that){
    data = that.data;
    that.data = nullptr;
}};

性能方面的差異是什么:

string s1("test");
string s2(std::move(s1));

string s1("test");
string s2 = string();
s2.movee(s1);

In the case of rvalues, the compiler spares us the time and memory taken to reform a new object and assign the rvalue to it, and then using that new object to change the values in the moved-to object, thus increasing performance. 但是在左值 object 的情況下,移動運算符並沒有提高性能,它當然是在提高可用性和可讀性,但它並沒有像右值一樣提高性能,我錯了嗎?

可以使用帶有指針的間接來實現相同的功能。 事實上,我們曾經,甚至現在,這正是您的移動構造函數/賦值運算符內部發生的事情!

是的, std::move變量的大部分好處在於代碼的簡潔性。 但這並非毫無意義。 使用移動構造函數/賦值運算符竊取資源使我們能夠巧妙、快速地完成此操作,而不會受到黑客攻擊或任何性能損失。 您的代碼將更易於維護且更易於合理化。 您將不太想添加一個額外的間接層,動態分配不需要動態分配的東西,只是為了獲得任何可以理解的代碼,因為現在這樣做沒有任何好處。

但是,不要忘記您的標准容器在幕后為您執行此操作。 例如,當std::vector調整大小時。 這是非常有價值的。 如果我們只能從臨時人員那里搬走,那將是不可能的,我們將浪費大量機會。

用臨時工做這件事並沒有什么不同。 只是它為您完成,而無需鍵入std::move

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM