微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将大值从 Box 复制到 Rust 中的 Vec 中,而不会炸毁堆栈

如何解决将大值从 Box 复制到 Rust 中的 Vec 中,而不会炸毁堆栈

我想将一个非常大的值从一个盒子复制(而不是移动)到一个 vec 中。执行此操作的正常方法(取消引用框)意味着将值临时复制到堆栈中,这会破坏它。这是一个示例和一个可以复制的 Playground 链接

fn main() {
    let big_value = Box::new([0u8; 8 * 1024 * 1024]);
    let mut vec = Vec::new();
    vec.push(*big_value);
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=5998cff185dc209e7a1e676d41850ff4

由于 Box 和 Vec 都在堆上,所以应该可以不通过堆栈进行复制。这里最好的解决方案是什么?

解决方法

在我发表的 Reddit 帖子上看到这个答案:https://old.reddit.com/r/rust/comments/n2jasd/question_copy_big_value_from_box_into_vec_without/gwmrcxp/

您可以使用 vec.extend_from_slice(std::slice_from_ref(&big_value)); 执行此操作。这不执行任何分配,只是将 big_value 从堆复制到 vec 中的新槽中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。