std::move 一个堆栈对象(到不同的线程)
std::move a stack object (to a different thread)
所以有两件事我不确定。
如果我这样做:
void sendToDifferentThread(SomeClass &&obj);
...
{
SomeClass object;
sendToDifferentThread(std::move(object));
}
会发生什么?如果 object
是在堆栈上创建的,怎么可能只有一个副本,因为当我们离开封闭范围时,堆栈上的所有内容都会被销毁?
如果我这样做:
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++ 的角度来看,肯定涉及两个不同的对象,如果您尝试将其视为只有那个场景中存在的一个对象。
所以有两件事我不确定。
如果我这样做:
void sendToDifferentThread(SomeClass &&obj); ... { SomeClass object; sendToDifferentThread(std::move(object)); }
会发生什么?如果 object
是在堆栈上创建的,怎么可能只有一个副本,因为当我们离开封闭范围时,堆栈上的所有内容都会被销毁?
如果我这样做:
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++ 的角度来看,肯定涉及两个不同的对象,如果您尝试将其视为只有那个场景中存在的一个对象。