加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 移动语义如何保留临时变量的数据?

发布时间:2020-12-16 10:01:04 所属栏目:百科 来源:网络整理
导读:我正在读这篇文章: What are move semantics? 请注意,移动构造函数的帖子中给出的示例是: string(string that) { data = that.data; that.data = nullptr;} 当我们使用字符串a(x y)来构造一个新字符串时,我发现它很混乱.由于x y的结果是一个临时变量,它很
我正在读这篇文章: What are move semantics?

请注意,移动构造函数的帖子中给出的示例是:

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

当我们使用字符串a(x y)来构造一个新字符串时,我发现它很混乱.由于x y的结果是一个临时变量,它很快就会被破坏.这意味着复制指针(data = that.data)确实会复制悬空指针,原始数据(应该存储在xy的堆栈帧中,在函数调用完成后被清理)被销毁.似乎将that.data设置为nullptr无济于事,因为堆栈框架无论如何都会被清理干净.

任何人都可以解释为什么这不是一个问题? c如何实际处理这种情况?

解决方法

当你这样做时:

string a(x + y);

它相当于:

string temp(x + y);
string a(move(temp));
//destroy temp

您引用的移动构造函数的相关代码采用as和this作为temp,因此可以将其内联为:

string temp(x + y);
string a(/*uninitialized*/);
a.data = temp.data;
temp.data = nullptr;
//destroy temp

正如您所看到的,temp.data是一个被取消的,因此temp的析构函数变为无操作,并且实际数据在a中存活,如预期的那样.

看起来你的困惑来自于数据的来源.在最简单的字符串实现中,string :: data始终是动态分配的内存块:

string(const char *str)
{
    size_t len = strlen(str);
    data = new char[len + 1];
    strcpy(data,len);
}   
~string()
{
    delete[] data;
}

即使字符串在堆栈上分配,例如temp和a,甚至x和y,它们的数据存储块也是动态的.

真实的,真实世界的字符串实现通常进行非动态短字符串优化.但是如果你这样做,那么移动构造函数(以及任何其他成员函数)将会更复杂一些.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读