2015-09-05 48 views
0

我正在通過編寫簡單的二進制解碼器來學習Rust。在運行時在堆上分配緩衝區

我正在使用BufferedReaderbyteorder crate來讀取數字,但我在讀取字節緩衝區時遇到問題。

我想將字節數據讀入運行時分配的緩衝區中。 然後我想將這個緩衝區的所有權傳遞給一個結構體。當struct不再使用時,緩衝區應該被釋放。

除了一些Vec::with_capacity()黑客攻擊之外,似乎沒有辦法在堆上分配運行時大小確定的數組。任何想法如何用適當的Rust語義來實現?

+0

你的問題似乎更接近「我如何在穩定的代碼中使用'box'的功能」。也許你應該更新你的頭銜。 – Shepmaster

+1

只是「語義學」的一點:'box' *是*正確的鏽,它現在只是不穩定的鏽:) –

回答

1

鏽病是一種低層次的語言;因此您可以分配原始內存,然後自己填充對象。當然,這將需要unsafe的代碼,因爲所有的原始內存擺弄。

這裏是a complete example

#![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安全地管理內存我。這只是簡單!

+1

*自己填充對象* - 值得一提的是零大小的類型和析構函數以及解釋爲什麼'Vec'更適合使用的所有其他複雜性?任何可能使用'as * mut i32'而不是'transmute'?也許使用'mem :: size_of'而不是硬編碼'4'?而爲了我自己的好奇心,爲什麼要將內存對準4K塊?爲「只使用Vec」+1「^ _^+1。 – Shepmaster

+0

@Shepmaster:我在列舉很多潛在問題時猶豫不決,但我擔心它聽起來像散亂...... –

+0

有一天,你可以成爲專業的漫步者,比如我自己! ;-) – Shepmaster

0

我試過使用box,但它似乎是實驗性的,我不能在發佈分支中使用它。任何想法如何用適當的Rust語義來實現?

這是覆蓋在The Rust Programming Language,特別是部分 「The Stack and the Heap」。

使用Box::new

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

是的,'Box :: new'在堆上創建變量。但據我所知,調用「Box :: new」會在堆棧中創建變量,函數調用會將其複製到堆中。 '框'語法應該在堆AFAIK上創建。這可能是一個問題,因爲我想創建512 KB緩衝區。 – semtexzv

+0

@semtexzv你可以指出一些文件或反彙編,證明這一點? Rust之下的優化器(由LLVM提供)非常強大。 – Shepmaster

+0

'let mut xx = Box :: new([0u8; 5000000]);'導致堆棧溢出。它應該分配5兆數據。但我可能理解這個錯誤。 – semtexzv