C++ 标准库读书杂记8 浅析std::move

首先站在C ++ 的角度说一下左值和右值;

右值:不具名的变量

左值:具名变量

其实呢概念上说不具名,隐含的意思就是作用域非常小的变量。站在内存的角度上没啥区别,主要在编译器角度上判断变量生命周期,他所在的地址是否可以再次被使用。

那么这种在生命周期末尾的变量我们都可以叫做右值,所以右值我觉得描述的是即将被释放的变量。大可不必去纠结什么左值引用,右值引用,那是语法规则层面的东西。只要进去的是数据变量就ok.

	string str1("abcdefghijkl"),str2;
	string str3("abcdefghijkl"), str4;


	str2 = std::move(str1);
	str4 = std::move(*&str3);

	cout << "str1" << str1 << endl;
	cout << "str2" << str2 << endl;

接下来说一下std::move()具体流程://

以string为例 :根据形参类型,获取形参所占内存大小,调用memmove拷贝内存:

C 语言运行库不熟悉的可以去学习一下memmove,memcmp,strcpy and so on .

void* _memmove(void* dest, const void* src, size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判断dest指针和src指针是否为空,若为空抛出异常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;

	if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝
		while (count--)
			*tmp_dest++ = *tmp_src++;
	else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝
	{
		tmp_src += count - 1;
		tmp_dest += count - 1;
		while (count--)
			*tmp_dest-- = *tmp_src;
	}
	//else(tmp_src==tmp_dest) 此时不进行任何操作
	return dest;
}

以vector<int>为例 :根据形参类型,获取形参所占内存大小,调用vector::_Swap_all拷贝内存:

void _Assign_rv(_Myt&& _Right, true_type)
		{	// move from _Right, stealing its contents
		this->_Swap_all((_Myt&)_Right);
		this->_Myfirst = _Right._Myfirst;
		this->_Mylast = _Right._Mylast;
		this->_Myend = _Right._Myend;

		_Right._Myfirst = pointer();
		_Right._Mylast = pointer();
		_Right._Myend = pointer();
		}

其他的类型就不测试了。

简而言之:move语意就是对内存拷贝的封装,而避免使用拷贝构造函数。(还不理解的话可以深入研究一下内存布局)

至于STL 提到的实参经历 move语意之后属于不确定变量,因为C++ 自己搞的鬼,把数据结构破坏了,你无法再正常读出数据,是人为的。

比如:string:右值在经历move语句后, 如果在作用域内,你在使用他是为空的,指针没变化,而真实的内存跟之前一样,只有string的第一个字符被赋值/0,所以读不出东西。 如果你还想要void ptr了解一下。

以上剖析浅尝辄止,不具有普遍性,只是针对特例分析以帮助理解C++理念及底层实现。

————留个小尾巴

                                祝老师生日快乐!是您让我遇见更好的自己!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值