#include <iostream>
#include <vector>
#include <string>
std::vector<std::string> getStrings() {
std::vector<std::string> temp;
temp.emplace_back("Hello");
temp.emplace_back("World");
return temp;
}
int main() {
// 使用std::move
std::vector<std::string> strings = std::move(getStrings());
// 打印内容
for (const auto& str : strings) {
std::cout << str << " ";
}
std::cout << std::endl;
return 0;
}
std::move对代码可读性的影响
- 积极方面:在上述代码中,
std::move
明确表示getStrings()
返回的临时std::vector<std::string>
对象的资源所有权将被转移到strings
中,而不是进行深拷贝。这对于理解代码中资源转移的语义非常有帮助,让读者清楚知道这里是在进行资源的高效转移而不是复制。
- 消极方面:如果不熟悉
std::move
语义的程序员,看到std::move
可能会感到困惑,因为它看起来像是移动了对象,但实际上是将对象标记为可被“窃取”资源,底层操作可能比较隐晦。
若不使用std::move的不同效果
- 性能方面:如果不使用
std::move
,例如直接std::vector<std::string> strings = getStrings();
,那么getStrings
返回的临时std::vector<std::string>
对象会经历拷贝构造函数来初始化strings
。对于std::vector
以及其中包含的std::string
对象来说,这意味着内存的重新分配和数据的拷贝,性能开销较大。
- 资源管理方面:使用
std::move
后,临时对象的资源(如std::vector
的内部数组,std::string
的内部字符数组等)直接被转移到新对象,临时对象被置于有效但未指定的状态。若不使用std::move
,临时对象在拷贝完成后会被销毁,其占用的资源被释放,新对象则拥有自己独立分配的资源。