MST

星途 面试题库

面试题:C++ 中 std::move 对代码可读性的影响举例

请给出一段使用了 std::move 的 C++ 代码,并说明在这段代码中 std::move 是如何影响代码可读性的,同时阐述若不使用 std::move 会带来什么不同的效果。
16.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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对代码可读性的影响

  1. 积极方面:在上述代码中,std::move明确表示getStrings()返回的临时std::vector<std::string>对象的资源所有权将被转移到strings中,而不是进行深拷贝。这对于理解代码中资源转移的语义非常有帮助,让读者清楚知道这里是在进行资源的高效转移而不是复制。
  2. 消极方面:如果不熟悉std::move语义的程序员,看到std::move可能会感到困惑,因为它看起来像是移动了对象,但实际上是将对象标记为可被“窃取”资源,底层操作可能比较隐晦。

若不使用std::move的不同效果

  1. 性能方面:如果不使用std::move,例如直接std::vector<std::string> strings = getStrings();,那么getStrings返回的临时std::vector<std::string>对象会经历拷贝构造函数来初始化strings。对于std::vector以及其中包含的std::string对象来说,这意味着内存的重新分配和数据的拷贝,性能开销较大。
  2. 资源管理方面:使用std::move后,临时对象的资源(如std::vector的内部数组,std::string的内部字符数组等)直接被转移到新对象,临时对象被置于有效但未指定的状态。若不使用std::move,临时对象在拷贝完成后会被销毁,其占用的资源被释放,新对象则拥有自己独立分配的资源。