std::move 一个堆栈对象(到不同的线程)

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

所以有两件事我不确定。

  1. 如果我这样做:

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

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

  1. 如果我这样做:

    SomeClass object;
    doSomethingOnSameThread(std::move(object));
    

如果我在当前范围内对 object 以后做某事会怎样?它是 "moved away" 其他函数的,那么当前函数 "lose" 是否以某种方式拥有它?

C++在构造对象的时候,会同时分配内存。如果构造函数运行完成(没有抛出),那么对象是 "alive"。在某些时候,如果它是一个堆栈对象并且超出范围,或者它是一个堆对象并且您调用 delete,则调用它的析构函数并释放原始内存,然后该对象是 "dead"。 C++11 std::move / 移动构造函数不会改变任何这些。移动构造函数的作用是为您提供一种方法和一种简单的语法来 "destructively" 复制对象。

例如,如果您从 std::vector<int> 移动构造,而不是读取所有 int 并复制它们,它会将指针和大小计数复制到新向量,并且将旧指针设置为 nullptr 并将大小设置为 0(或者可能分配一个(微小的)最小大小的新向量......取决于实现)。基本上,当您从某物移出时,您必须将其保留在 "valid"、"alive" 状态——移出后它不是 "dead",并且析构函数稍后仍将被调用.它没有 "move",因为它仍然遵循相同的生命周期,现在它只是 "somewhere else in memory"。当您从一个对象 "move" 时,从 C++ 的角度来看,肯定涉及两个不同的对象,如果您尝试将其视为只有那个场景中存在的一个对象。