当前位置:   article > 正文

c++:std::move()_std::move 指针

std::move 指针

原理:
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;  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

例子:

#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;  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在上述代码中,std::move(s) 将 s 的类型从 std::string 转换为 std::string&&。之后,rs 可以“窃取” s 的资源,而 s 则成为一个空字符串。在输出时,可以看到 s 的内容已经被清空,而 rs 仍然持有原来的字符串内容。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号