首页 文章

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

提问于
浏览
0

我通过编写简单的二进制解码器来学习Rust .

我正在使用带有byteorder crateBufferedReader 来读取数字,但是我在读取字节缓冲区方面遇到了问题 .

我想将字节数据读入运行时分配的缓冲区 . 然后我想将此缓冲区的所有权传递给结构 . 当struct不再使用时,应该释放缓冲区 .

似乎没有办法在堆上分配具有在运行时确定的大小的数组,除了一些 Vec::with_capacity() hacks . 任何想法如何使用适当的Rust语义实现它?

2 回答

  • 2

    Rust是一种低级语言;因此,您可以分配原始内存,然后自己填充对象 . 当然,它需要 unsafe 代码,因为所有摆弄原始内存的都是 .

    这是a complete example

    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 为我安全地管理内存 . 它更简单!

  • 0

    我尝试使用盒子,但它似乎是实验性的,我不能用它与发布分支 . 任何想法如何使用适当的Rust语义实现它?

    这包含在The Rust Programming Language中,特别是“The Stack and the Heap)”部分 .

    使用Box::new

    fn main() {
        let answer: Box<u8> = Box::new(42);
    }
    

相关问题