首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时在堆上分配缓冲区

在运行时在堆上分配缓冲区
EN

Stack Overflow用户
提问于 2015-09-05 15:08:19
回答 3查看 4.3K关注 0票数 3

我是通过编写简单的二进制译码器来学习Rust的。

我使用带有BufferedReader附条箱来读取数字,但读取字节缓冲区时遇到了问题。

我希望将字节数据读入在运行时分配的缓冲区中。然后,我想将这个缓冲区的所有权传递给一个struct。当struct不再使用时,应该解除缓冲区的分配。

除了一些Vec::with_capacity()黑客之外,似乎没有办法分配在运行时在堆上确定大小的数组。有什么想法可以用正确的Rust语义来实现吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-05 16:20:31

锈蚀是一种低级语言,因此您可以分配原始内存,然后自己用对象填充它。当然,它将需要unsafe代码,就像所有处理原始内存的操作一样。

这是一个完整的例子

代码语言:javascript
复制
use std::{
    alloc::{self, Layout},
    mem, ptr,
};

fn main() {
    unsafe {
        let layout = Layout::from_size_align(512 * 1024, 4 * 1024).expect("Invalid layout");
        let mut raw: *mut i32 = mem::transmute(alloc::alloc(layout));

        for i in 0..(512 * 1024 / 4) {
            ptr::write(raw, i as i32);
            raw = raw.offset(1)
        }
    }
}

当然,在实际代码中,我只需要使用Vec来安全地管理内存。只是简单而已!

票数 5
EN

Stack Overflow用户

发布于 2020-06-09 14:16:03

这将创建一个预先分配的、存储在堆上的、存储在零的500 on字节缓冲区,而不需要不安全的锈蚀:

//更正

代码语言:javascript
复制
let mut buffer = vec![0_u8; 536870912];

注意,下面的代码不是一个好主意,很可能会导致堆栈溢出,因为缓冲区是在被装箱并移动到堆之前在堆栈上创建的。

//不正确-堆栈使用

代码语言:javascript
复制
let mut bytes: Box<[u8]> = Box::new([0_u8; 536870912])

//不正确-慢

代码语言:javascript
复制
let mut bytes = Vec::with_capacity(536870912);
for _ in 0..bytes.capacity() {
    bytes.push(0_u8);
}
票数 8
EN

Stack Overflow用户

发布于 2015-09-05 15:18:33

我试过使用box,但它似乎是实验性的,不能与发布分支一起使用。有什么想法可以用正确的Rust语义来实现吗?

这是在https://doc.rust-lang.org/stable/book/中讨论的,特别是"指向堆上的数据“一节。

使用Box::new

代码语言:javascript
复制
fn main() {
    let answer: Box<u8> = Box::new(42);
}

另请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32414567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档