Rust

Rustで巨大なヒープメモリを取る

More than 1 year has passed since last update.

4MBのヒープメモリを取ることに手こずったのでメモ。

Boxを使う方法

fn main() {
    let buf=Box::new([0;1024*1024*4]);
    println!("addr:{:?}",buf[1]);
}

こんなエラーが出て死ぬ

thread 'main' has overflowed its stack

なーんでヒープ使うのにスタックオーバーフローで死んでんだよ。
ヒープ確保してるだけじゃん、mallocだろ???????????
とか思ったけど、よくよく調べてみると次の手順で初期化しているらしい。

  1. スタックに領域確保&初期化
  2. 確保したヒープメモリにコピー

素直にヒープ領域を初期化しろよ
とか思ったけど、何か理由があってそうしてるんだと思う。しらんけど。

なので、Vecを使う。

fn main() {
    let mut buf :Vec<u8>= vec![0;1024*1024*4];
    println!("Hello, world!{:?}",buf);
}

未初期化の領域が欲しかったら以下のように。
ただし、メモリを確保して、ベクタの管理情報を自分で登録する
というように、あまりにもC言語的なミスが発生しやすそうなので使いたくない。

ぶっちゃけ自分で0-fillするので、上の例だけで十分っぽい。

fn main() {
    let mut buf ;
    unsafe{
        let len=1024*1024*4;
        buf=Vec::<u8>::with_capacity(len);
        buf.set_len(len);
    }
    println!("buf:{:?}",buf);
}

おわり