移动堆栈对象(到另一个线程)

std::move a stack object (to a different thread)

本文关键字:另一个 线程 堆栈 对象 移动      更新时间:2023-10-16

所以有两件事我不太确定。

  1. 如果我这样做:

    void sendToDifferentThread(SomeClass &&obj);
    ...
    {
        SomeClass object;
        sendToDifferentThread(std::move(object));
    }
    

会发生什么?如果object是在堆栈上创建的,怎么可能只有一个副本,因为当我们走出封闭作用域时,堆栈上的所有内容都被销毁了?

  • 如果我这样做:

    SomeClass object;
    doSomethingOnSameThread(std::move(object));
    
  • 如果我在当前范围内对object做些什么,会发生什么?它被"移走"到其他函数,那么当前函数是否以某种方式"失去"了它的所有权?

    在c++中,当构造一个对象时,内存是同时分配的。如果构造函数运行到完成(没有抛出),那么对象是"活的"。在某个时刻,如果它是一个堆栈对象,超出了作用域,或者它是一个堆对象,你调用delete,它的析构函数被调用,原始内存被释放,然后对象就"死"了。c++ 11 std::move/move构造函数不会改变这些。move构造函数的作用是提供一种方法和简单的语法来"破坏性地"复制对象。

    例如,如果您从std::vector<int>移动构造,而不是读取所有int s并复制它们,它将复制指针和大小计数而不是新向量,并将旧指针设置为nullptr和大小设置为0(或者可能,分配一个最小大小的(微小)新向量…取决于实现)。基本上,当你离开某物时,你必须让它处于"有效"、"活着"的状态——在你离开它后,它不是"死亡"的,析构函数仍将在稍后被调用。它没有"移动",因为它仍然遵循相同的生命周期,现在它只是"在记忆中的某个地方"。当你从一个对象"移动"时,从c++的角度来看,肯定涉及到两个不同的对象,如果你试图把它想象成在那个场景中只存在一个对象,我认为你在某一点之后就不能理解它了。