新余代网站建设公司,自己做的网站如何被百度检索,上海普陀门户网站,通用wap网站生成系统文章目录STD容器使用右值引用场景移动语义在容器中的使用主要体现在两个方面#xff1a;移动构造函数和移动赋值运算符。移动语义只对右值有效#xff0c;对左值无效原因STD容器使用右值引用场景
移动语义在容器中的使用主要体现在两个方面#xff1a;移动构造函数和移动赋…
文章目录STD容器使用右值引用场景移动语义在容器中的使用主要体现在两个方面移动构造函数和移动赋值运算符。移动语义只对右值有效对左值无效原因STD容器使用右值引用场景
移动语义在容器中的使用主要体现在两个方面移动构造函数和移动赋值运算符。
移动构造函数容器在插入元素时通常需要进行内存分配和对象构造操作。如果元素类型具有移动构造函数容器就可以使用移动构造函数来构造元素避免不必要的拷贝和销毁操作提高程序的性能和效率。
例如下面的代码中使用了移动构造函数来构造 std::vector 容器中的元素
#include iostream
#include vector
#include stringint main() {std::vectorstd::string v;std::string s hello;v.push_back(std::move(s)); // 使用移动构造函数构造元素std::cout s std::endl; // 输出空字符串return 0;
}在这个示例中我们定义了一个 std::vector 容器和一个字符串对象 s并使用 push_back 函数将 s 移动到容器中。由于使用了移动构造函数s 的资源所有权被转移到容器中s 变成了一个空字符串。
移动赋值运算符容器在进行元素赋值时通常需要进行对象销毁和对象构造操作。如果元素类型具有移动赋值运算符容器就可以使用移动赋值运算符来赋值元素避免不必要的拷贝和销毁操作提高程序的性能和效率。
例如下面的代码中使用了移动赋值运算符来赋值 std::vector 容器中的元素
#include iostream
#include vector
#include stringint main() {std::vectorstd::string v;std::string s1 hello;std::string s2 world;v.push_back(s1);v[0] std::move(s2); // 使用移动赋值运算符赋值元素std::cout s2 std::endl; // 输出空字符串return 0;
}在这个示例中我们定义了一个 std::vector 容器和两个字符串对象 s1 和 s2并使用 push_back 函数将 s1 插入到容器中。然后我们使用移动赋值运算符将 s2 赋值给容器中的元素。由于使用了移动赋值运算符s2 的资源所有权被转移到容器中s2 变成了一个空字符串。
需要注意的是移动语义只对右值有效对左值无效。因此在使用移动语义时需要注意对象的值类别。
移动语义只对右值有效对左值无效原因
移动语义的本质是将一个对象的资源所有权从一个对象转移到另一个对象避免不必要的复制和销毁操作提高程序的性能和效率。对于右值对象由于其不再被使用因此可以将其资源所有权转移到另一个对象避免了不必要的拷贝和销毁操作。
而对于左值对象由于其可能还会被使用因此不能将其资源所有权转移到另一个对象否则会导致程序出错。例如如果将一个左值对象的资源所有权转移到另一个对象那么原对象就不能再被使用这可能会导致程序出现未定义行为。
实例 当一个对象是左值时它通常是一个具有名称的变量或对象它在程序中可能还会被使用。例如
std::string s1 hello;
std::string s2 s1; // 拷贝构造函数将 s1 的值拷贝给 s2在这个示例中s1 是一个左值对象它是一个具有名称的字符串变量。当我们将 s1 的值赋给 s2 时会调用拷贝构造函数将 s1 的值拷贝给 s2这是因为 s1 是一个左值对象不能将其资源所有权转移到另一个对象。 若转移了所有权
而当一个对象是右值时它通常是一个临时对象或表达式的结果它在程序中不再被使用。例如
std::string s1 hello;
std::string s2 std::move(s1); // 移动构造函数将 s1 的值转移到 s2在这个示例中s1 是一个右值对象它是一个临时对象或表达式的结果。当我们将 s1 的值转移到 s2 时会调用移动构造函数将 s1 的值转移到 s2这是因为 s1 是一个右值对象可以将其资源所有权转移到另一个对象。由于 s1 不再被使用因此可以将其资源所有权转移到 s2避免了不必要的拷贝和销毁操作。
因此移动语义只对右值对象有效对左值对象无效。在使用移动语义时需要注意对象的值类别避免出现不必要的错误和问题。