gpt4 book ai didi

c++ - 具有左值的C++ std::move()性能明智

转载 作者:行者123 更新时间:2023-12-01 14:57:16 27 4
gpt4 key购买 nike

我刚刚学习完有关左值,右值,移动构造函数和移动运算符的知识。
我可以看到将move构造函数与 rvalues 性能和可用性结合使用的附加值(value)。
但是我看不到在 lvalues 性能方面明智地使用move运算符和move构造函数一起使用的附加值,确保有附加值可用性的明智做法,但是我们无法使用其他一些技术(例如用于的指针)为lvalues实现相同的功能例。
所以我的问题是:在 lvalues 性能明智的情况下,使用带有move构造函数的move运算符的附加值(value)是什么?
感谢您阅读我的问题。
例:

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);
对于右值,编译器会节省我们花费的时间和内存来重建一个新对象并为其分配右值,然后使用该新对象来更改移至对象中的值,从而提高性能。但是在使用左值对象的情况下,移动运算符并没有提高性能,而是在提高可用性和可读性,但是并没有像在右值上那样提高性能,对吗?

最佳答案

您可以通过使用指针间接实现相同的功能。确实,我们曾经(甚至现在)确实是您的move构造函数/赋值运算符内部发生的事情!
是的,当您使用std::move变量时,大多数好处在于代码的整洁。但这不是没有意义的。与移动构造函数/赋值运算符一起窃取资源使我们能够快速,整洁地进行操作,而不会受到黑客攻击或任何性能损失。您的代码将更具可维护性,并且更易于合理化。您将不愿意添加额外的间接层,动态分配不需要动态分配的内容,只是使代码以任何方式都可以理解,因为这样做没有任何好处。
但!不要忘记您的标准容器在幕后为您做到这一点,例如当std::vector调整大小时。那是非常有值(value)的。如果我们只能暂时离开,那将是不可能的,我们将有大量的浪费机会。
与临时人员进行操作实际上并没有什么不同;只需输入std::move即可完成。

关于c++ - 具有左值的C++ std::move()性能明智,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63015403/

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