gpt4 book ai didi

c++ - std::move 堆栈对象(到不同的线程)

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:58 24 4
gpt4 key购买 nike

所以有两件事我不确定。

  1. 如果我这样做:

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

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

  1. 如果我这样做:

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

如果我稍后在当前范围内对 object 做一些事情会发生什么?它被“移走”到其他功能,那么当前功能是否以某种方式“失去”了它的所有权?

最佳答案

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

例如,如果您从 std::vector<int> 移动构造,而不是阅读所有 int s 并复制它们,它会将指针和大小计数复制到新 vector ,并将旧指针设置为 nullptr 并将大小设置为 0(或者可能分配一个(微小的)最小大小的新 vector ......取决于关于实现)。基本上,当您从某物中移出时,您必须将其保留在“有效”、“事件”状态——在您移出后它不是“死”,并且稍后仍会调用析构函数。它并没有“移动”,因为它仍然遵循相同的生命周期,现在它只是“内存中的其他地方”。当您从一个对象“移动”时,从 C++ 的角度来看,肯定涉及两个不同的对象,如果您尝试将其视为只有一个对象,我认为在某一点之后您无法理解它在那种情况下存在。

关于c++ - std::move 堆栈对象(到不同的线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com