首页 > 解决方案 > 如何从 std::optional 获取 QByteArray并离开 std::nullopt 没有额外的mallocs?

问题描述

我需要编写一个函数来获取optional<QByteArray>' 的底层数组的所有权。

在 Rust 中,它是通过这种方式完成的:

fn my_func(f: &mut Option<Box<[u8]>>) -> Box<[u8]> {
     //how to do "take" in c++17?
     f.take().unwrap()
}

我知道std::move,但据我了解,此代码将为malloc新数组提供数据,交换指针并删除不需要的数据QByteArray

std::optional<QByteArray> optarr = ...
QByteArray optarr = std::move(*myopt);
optarr.reset()

有没有办法和 Rust 一样做到这一点(也就是说,不为临时分配内存QByteArray)?

标签: c++qtc++17

解决方案


你的假设std::move是错误的。粗略地说 std::move 强制转换为右值引用,它本身不会生成任何实际代码。以下行将QByteArray通过调用其移动构造函数在堆栈上创建一个。

QByteArray optarr = std::move(*myopt);

移动构造函数初始化Data来自另一个 QByteArray 的指针,并将对方的数据指针替换为指向共享空数据的指针。不malloc涉及,只是两个指针分配。

移动构造函数的实现如下所示:

inline QByteArray(QByteArray && other) Q_DECL_NOTHROW : d(other.d) { other.d = Data::sharedNull(); }

所以你的代码实际上是在做你想做的事。


推荐阅读