我是通过编写简单的二进制译码器来学习Rust的。
我使用带有BufferedReader的附条箱来读取数字,但读取字节缓冲区时遇到了问题。
我希望将字节数据读入在运行时分配的缓冲区中。然后,我想将这个缓冲区的所有权传递给一个struct。当struct不再使用时,应该解除缓冲区的分配。
除了一些Vec::with_capacity()黑客之外,似乎没有办法分配在运行时在堆上确定大小的数组。有什么想法可以用正确的Rust语义来实现吗?
发布于 2015-09-05 16:20:31
锈蚀是一种低级语言,因此您可以分配原始内存,然后自己用对象填充它。当然,它将需要unsafe代码,就像所有处理原始内存的操作一样。
这是一个完整的例子
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来安全地管理内存。只是简单而已!
发布于 2020-06-09 14:16:03
这将创建一个预先分配的、存储在堆上的、存储在零的500 on字节缓冲区,而不需要不安全的锈蚀:
//更正
let mut buffer = vec![0_u8; 536870912];注意,下面的代码不是一个好主意,很可能会导致堆栈溢出,因为缓冲区是在被装箱并移动到堆之前在堆栈上创建的。
//不正确-堆栈使用
let mut bytes: Box<[u8]> = Box::new([0_u8; 536870912])//不正确-慢
let mut bytes = Vec::with_capacity(536870912);
for _ in 0..bytes.capacity() {
bytes.push(0_u8);
}发布于 2015-09-05 15:18:33
我试过使用
box,但它似乎是实验性的,不能与发布分支一起使用。有什么想法可以用正确的Rust语义来实现吗?
这是在https://doc.rust-lang.org/stable/book/中讨论的,特别是"指向堆上的数据“一节。
使用Box::new
fn main() {
let answer: Box<u8> = Box::new(42);
}另请参阅:
https://stackoverflow.com/questions/32414567
复制相似问题