赞
踩
原理:
std::move 是一个类型转换器,用于将左值转换为右值引用。左值赋值给右值后被清空。
std::move并不会开辟新的空间。它只是将一个左值转换为右值引用,使得该对象可以被移动而不是复制。移动操作只是将对象的资源所有权从一个对象转移到另一个对象,而不涉及新的内存分配。因此,std::move不会创建新的空间。
优点:
本身不直接开辟新空间,但它可以用于优化性能,特别是在处理资源密集型对象时,可以避免不必要的拷贝操作,提高性能,
例子:
#include <iostream>
#include <string>
int main() {
std::string s = "hello";
std::string&& rs = std::move(s); // s 现在是一个空字符串,而 rs 持有原来的字符串内容
std::cout << "s: " << s << std::endl; // 输出 "s: ",因为 s 已经是一个空字符串了
std::cout << "rs: " << rs << std::endl; // 输出 "rs: hello",因为 rs 持有原来的字符串内容
return 0;
}
例子:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> vec = {"hello", "world"};
std::string* arr = vec.data(); // 将 vector 转换为数组指针
std::string&& rarr = std::move(*arr); // 将数组中的元素转换为右值引用
std::cout << "rarr: " << rarr << std::endl; // 输出 "rarr: hello"
// 注意:arr 现在指向一个空字符串,因为该字符串已经被移动了
std::cout << "arr[0]: " << arr[0] << std::endl; // 输出 "arr[0]: ",因为 arr[0] 已经被移动了
return 0;
}
在上述代码中,std::move(s) 将 s 的类型从 std::string 转换为 std::string&&。之后,rs 可以“窃取” s 的资源,而 s 则成为一个空字符串。在输出时,可以看到 s 的内容已经被清空,而 rs 仍然持有原来的字符串内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。