移动堆栈对象(到另一个线程)
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
做些什么,会发生什么?它被"移走"到其他函数,那么当前函数是否以某种方式"失去"了它的所有权?
在c++中,当构造一个对象时,内存是同时分配的。如果构造函数运行到完成(没有抛出),那么对象是"活的"。在某个时刻,如果它是一个堆栈对象,超出了作用域,或者它是一个堆对象,你调用delete,它的析构函数被调用,原始内存被释放,然后对象就"死"了。c++ 11 std::move/move构造函数不会改变这些。move构造函数的作用是提供一种方法和简单的语法来"破坏性地"复制对象。
例如,如果您从std::vector<int>
移动构造,而不是读取所有int
s并复制它们,它将复制指针和大小计数而不是新向量,并将旧指针设置为nullptr和大小设置为0(或者可能,分配一个最小大小的(微小)新向量…取决于实现)。基本上,当你离开某物时,你必须让它处于"有效"、"活着"的状态——在你离开它后,它不是"死亡"的,析构函数仍将在稍后被调用。它没有"移动",因为它仍然遵循相同的生命周期,现在它只是"在记忆中的某个地方"。当你从一个对象"移动"时,从c++的角度来看,肯定涉及到两个不同的对象,如果你试图把它想象成在那个场景中只存在一个对象,我认为你在某一点之后就不能理解它了。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在另一个线程中调用luaL_error会引发qWarning
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 结束另一个线程中使用的对象的生存期
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 计时器是否从另一个线程启动?
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- Qt 在另一个线程中无限循环
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 从另一个线程发出信号是否安全?
- AMQP-CPP,libev >停止ev_loop来自另一个线程
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- ::grpc::ServerReaderWriter 对象在另一个线程中一段时间后无法调用
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- C++将互斥锁锁定为来自另一个线程
- QTcpSocket:消息不是从另一个线程发送的
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?