gpt4 book ai didi

c++ - 在 C++ 中使用右值设置类变量的最有效方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:40:12 25 4
gpt4 key购买 nike

我刚开始使用 C++11 右值。我阅读了一些教程,但我还没有找到答案。

设置类变量的最佳方式(最有效的方式)是什么?下面的代码是否正确? (假设 std::string 已经定义了移动构造函数和赋值运算符)。

class StringWrapper
{
private:
std::string str_;

public:
StringWrapper() : str_("") {}

void setString1(std::string&& str) {
str_ = std::move(str);
}

void setString2(const std::string& str) {
str_ = std::move(str);
}

// other possibility?
};

int main() {
std::string myText("text");

StringWrapper x1, x2;

x1.setString?("text"); // I guess here should be setString1
x2.setString?(myText); // I guess here should be setString2
}

我知道编译器可以优化我的代码和/或我可以使用重载函数。我只想知道什么是最好的方法。

最佳答案

Herb Sutter's advice这是从标准的 C++98 方法开始:

void setString(const std::string& str) {
str_ = str;
}

如果您需要优化右值,请添加一个采用右值引用的重载:

void setString(std::string&& str) noexcept {
str_ = std::move(str);
}

请注意,std::string 的大多数实现都使用小字符串优化,因此如果您的字符串很小,移动与复制一样,您不会得到任何好处。

很容易使用按值传递然后移动(如 Adam Hunyadi 的回答)以避免必须编写多个重载。但 Herb 指出,它不会重复使用 str_ 的任何现有容量。如果你用左值多次调用它,它每次都会分配一个新的字符串。如果您有 const std::string& 重载,那么它可以重新使用现有容量并避免分配。

如果你真的很聪明,你可以使用一个使用完美转发的模板化 setter ,但要让它完全正确实际上是相当复杂的。

关于c++ - 在 C++ 中使用右值设置类变量的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44701673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com