【发布时间】:2020-11-10 21:16:03
【问题描述】:
我刚刚学习完左值、右值、移动构造函数和移动运算符。 我可以看到使用具有 rvalues 性能和可用性的移动构造函数的附加值。 但是我看不到使用带有 lvalues 性能的 move 构造函数的附加值,肯定有附加值可用性,但是我们不能使用一些实现 lvalues 相同的功能其他技术,例如指针。 所以我的问题是:使用带有 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);
在右值的情况下,编译器为我们节省了时间和内存来重新构造一个新对象并将右值分配给它,然后使用该新对象更改移动到对象中的值,从而提高性能.但是在左值对象的情况下,移动操作符并没有提高性能,它当然是提高可用性和可读性,但它并没有像右值一样提高性能,我错了吗?
【问题讨论】:
-
std::move只是告诉编译器:“可以将此左值视为右值,并窃取其内容;我不打算以后使用它”。因此,现有的右值机制也可以应用于这个左值。为左值发明一种全新的、独立的机器,而不是重用已经存在于右值的机器,有什么意义? -
感谢您的回答,我可以看到易用性,但我的问题是考虑性能
-
您可以使用其他技术归档大多数内容。但是在语言的核心中添加一个标准化的功能可以使它得到很好的定义,并且理想地允许编译器做得更好,允许静态分析器警告你错误,并提高可维护性。
-
考虑什么的性能,与其他什么相比?
-
附加值和一般一样,你移动而不是复制。移动语义可以在没有语言支持的情况下实现,但它相当具有侵入性,因此在语言支持时使用“其他技术”并不是很理想
标签: c++ performance c++11 std move