c++ - 如何从 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
)?
解决方案
你的假设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(); }
所以你的代码实际上是在做你想做的事。
推荐阅读
- html - 有没有办法在打印网站时中断半页?
- django - 在Django中使用模型FileField上传文件时如何获取实例
- java - 为什么我的循环在没有条件时只打印负数?
- c++ - 将字符数组转换为字符串时的意外行为
- zoom-sdk - 我无法使用 Zoom API 更新用户设置“当云录制可用时”选项,并且没有发回错误消息
- react-native - @expo/vector-icons 玩笑失败了
- excel - Excel VBA - 具有多个条件的 Xlookup
- reactjs - Formik - 重置表单并显示新值
- java - 在基于 angular java maven 的项目中安装 bootsprap css-4
- c++ - std::cout 在结构 c++ 的向量的声明和定义后不起作用