在运行时在堆上分配缓冲区
Allocating a buffer on the heap at runtime
我正在通过编写简单的二进制解码器来学习 Rust。
我正在使用 BufferedReader
和 byteorder crate 来读取数字,但我在读取字节缓冲区时遇到问题。
我想将字节数据读入运行时分配的缓冲区。
然后我想将这个缓冲区的所有权传递给一个结构。当不再使用结构时,应释放缓冲区。
除了一些 Vec::with_capacity()
hack 之外,似乎没有办法在堆上分配大小在运行时确定的数组。有什么想法可以用适当的 Rust 语义来实现吗?
I tried using box
but it seems that it is experimental and I can't use it with release branch. Any ideas how to implement this with proper Rust semantics?
这在 The Rust Programming Language, specifically the section "Using Box<T> to Point to Data on the Heap 中有介绍。
使用Box::new
:
fn main() {
let answer: Box<u8> = Box::new(42);
}
另请参阅:
- Creating a fixed-size array on heap in Rust
Rust 是一种低级语言;因此你可以分配原始内存,然后自己用对象填充它。当然,它需要 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
来为我安全地管理内存。更简单!
这将创建一个预分配的可变 500MB 字节缓冲区,存储在堆上,不需要不安全的 rust:
// 正确
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);
}
我正在通过编写简单的二进制解码器来学习 Rust。
我正在使用 BufferedReader
和 byteorder crate 来读取数字,但我在读取字节缓冲区时遇到问题。
我想将字节数据读入运行时分配的缓冲区。 然后我想将这个缓冲区的所有权传递给一个结构。当不再使用结构时,应释放缓冲区。
除了一些 Vec::with_capacity()
hack 之外,似乎没有办法在堆上分配大小在运行时确定的数组。有什么想法可以用适当的 Rust 语义来实现吗?
I tried using
box
but it seems that it is experimental and I can't use it with release branch. Any ideas how to implement this with proper Rust semantics?
这在 The Rust Programming Language, specifically the section "Using Box<T> to Point to Data on the Heap 中有介绍。
使用Box::new
:
fn main() {
let answer: Box<u8> = Box::new(42);
}
另请参阅:
- Creating a fixed-size array on heap in Rust
Rust 是一种低级语言;因此你可以分配原始内存,然后自己用对象填充它。当然,它需要 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
来为我安全地管理内存。更简单!
这将创建一个预分配的可变 500MB 字节缓冲区,存储在堆上,不需要不安全的 rust:
// 正确
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);
}