gpt4 book ai didi

c++ - "moving"从栈到堆?

转载 作者:搜寻专家 更新时间:2023-10-31 00:25:55 25 4
gpt4 key购买 nike

我需要围绕 C++ 库编写一个 C 包装器,并且我需要在堆上分配对象。C++ 库的函数和方法使用并返回在堆栈上分配的对象。

我知道,我可以通过复制将对象从堆栈“传输”到堆,即 auto heapObj = new Foo(stackObj); 但我想避免复制并尝试 如果可以,请移动

这似乎“有效”(令我惊讶)。幕后是否有拷贝发生?如果不是,这个模式可以安全使用吗?

main.h

class Foo {
public:
std::vector<int> big;

explicit Foo(size_t len);

Foo(Foo&& other) noexcept;

// remove copy constructor
Foo(const Foo &) = delete;

// delete assignment operator
Foo &operator=(const Foo &) = delete;


size_t size();
};

main.cpp

#include <iostream>
#include "main.h"

Foo::Foo(size_t len) : big(len) {}

Foo::Foo(Foo&& other) noexcept : big(std::move(other.big)) {}

size_t Foo::size() { return this->big.size(); }

int main() {
Foo ms(1000); // on the stack
ms.big[0] = 42;

auto mh = new Foo(std::move(ms)); // on the heap (no copy?)

std::cout << mh->size() << ", " << mh->big[0] << std::endl;

delete mh;
}

最佳答案

首先,移动一个int或者一个指针相当于一个拷贝。也就是说,如果你有一个

struct X {
int a, b;
int* data;
};

然后移动它不会比复制它便宜(暂时忽略 data 的所有权)。巧合的是,上面基本上就是 std::vector 从远处看的样子:一个 sizecapacity 成员加上一些指向一大块的指针内存。

移动与复制的重要之处在于资源所有权std::vector 拥有一些堆内存(data)的所有权。如果您复制 std::vector,则必须复制该堆内存,以便原始数据和拷贝都可以拥有自己的数据所有权。但是如果你移动它,那么只有移动到的 vector 需要保留所有权,所以 data 指针可以从一个传递到另一个(而不是所有数据), 因为可以从移出的对象中“窃取”所有权。

这就是为什么将对象从堆栈“移动”到堆没有冲突的原因:对象本身基本上仍然从一个地方复制到另一个地方,但是它的资源(或其子对象,如 big) 拥有的不是复制而是移动(“被盗”)。

关于c++ - "moving"从栈到堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538175/

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