我正在通過編寫簡單的二進制解碼器來學習Rust。在運行時在堆上分配緩衝區
我正在使用BufferedReader
與byteorder crate來讀取數字,但我在讀取字節緩衝區時遇到問題。
我想將字節數據讀入運行時分配的緩衝區中。 然後我想將這個緩衝區的所有權傳遞給一個結構體。當struct不再使用時,緩衝區應該被釋放。
除了一些Vec::with_capacity()
黑客攻擊之外,似乎沒有辦法在堆上分配運行時大小確定的數組。任何想法如何用適當的Rust語義來實現?
我正在通過編寫簡單的二進制解碼器來學習Rust。在運行時在堆上分配緩衝區
我正在使用BufferedReader
與byteorder crate來讀取數字,但我在讀取字節緩衝區時遇到問題。
我想將字節數據讀入運行時分配的緩衝區中。 然後我想將這個緩衝區的所有權傳遞給一個結構體。當struct不再使用時,緩衝區應該被釋放。
除了一些Vec::with_capacity()
黑客攻擊之外,似乎沒有辦法在堆上分配運行時大小確定的數組。任何想法如何用適當的Rust語義來實現?
鏽病是一種低層次的語言;因此您可以分配原始內存,然後自己填充對象。當然,這將需要unsafe
的代碼,因爲所有的原始內存擺弄。
#![feature(alloc, heap_api)]
extern crate alloc;
use alloc::heap;
use std::{mem,ptr};
fn main() {
unsafe {
let mut raw: *mut i32 = mem::transmute(heap::allocate(512 * 1024, 4 * 1024));
for i in 0..(512 * 1024/4) {
ptr::write(raw, i as i32);
raw = raw.offset(1)
}
}
}
當然,在實際的代碼,我只想用Vec
安全地管理內存我。這只是簡單!
*自己填充對象* - 值得一提的是零大小的類型和析構函數以及解釋爲什麼'Vec'更適合使用的所有其他複雜性?任何可能使用'as * mut i32'而不是'transmute'?也許使用'mem :: size_of'而不是硬編碼'4'?而爲了我自己的好奇心,爲什麼要將內存對準4K塊?爲「只使用Vec」+1「^ _^+1。 – Shepmaster
@Shepmaster:我在列舉很多潛在問題時猶豫不決,但我擔心它聽起來像散亂...... –
有一天,你可以成爲專業的漫步者,比如我自己! ;-) – Shepmaster
我試過使用
box
,但它似乎是實驗性的,我不能在發佈分支中使用它。任何想法如何用適當的Rust語義來實現?
這是覆蓋在The Rust Programming Language,特別是部分 「The Stack and the Heap」。
使用Box::new
:
fn main() {
let answer: Box<u8> = Box::new(42);
}
是的,'Box :: new'在堆上創建變量。但據我所知,調用「Box :: new」會在堆棧中創建變量,函數調用會將其複製到堆中。 '框
@semtexzv你可以指出一些文件或反彙編,證明這一點? Rust之下的優化器(由LLVM提供)非常強大。 – Shepmaster
'let mut xx = Box :: new([0u8; 5000000]);'導致堆棧溢出。它應該分配5兆數據。但我可能理解這個錯誤。 – semtexzv
你的問題似乎更接近「我如何在穩定的代碼中使用'box'的功能」。也許你應該更新你的頭銜。 – Shepmaster
只是「語義學」的一點:'box' *是*正確的鏽,它現在只是不穩定的鏽:) –