rust で buffer を作る時は

スタック上

スタック上におくのが一番安定

#![allow(unused)]
fn main() {
let buf = [0u8; 10];
}

ヒープ上(Vec 使用時)

Vec など、ヒープにおくバッファーがほしい時は

#![allow(unused)]
fn main() {
let buf = vec![0u8; 10];
}

このように、0 であらかじめ埋めておくこと

NG 例 1 new を使ってしまう

new は容量も決めないし、0 埋めもしないので一番あかんやつ

#![allow(unused)]
fn main() {
let buf = Vec::new();
}

NG 例 2 with_capacity を使ってしまう

with_capacity で容量だけ決めておいて、初期化してないパターン

#![allow(unused)]
fn main() {
let buf = Vec::with_capacity(10);
}

妙案例 イテレーターを使う

イテレーターで初期化することもできる。

#![allow(unused)]
fn main() {
let buf = (0..10).map(|_| 0).collect::<Vec<u8>>();
}

vec![]は初期値を clone するのに対して、こちらは map で一つずつ指定していく。 buf は u8 なので問題ないが、clone の動作が特殊な Rc,Arc を使う時はイテレーターを使用することになる。 詳しくは、こちらの記事を参照されたし

俺が知ってる rust の vec

サイズ指定が必要な理由と 0 埋めが必要な理由

fn read(buf: &mut [u8]) {
    buf[0] = b'h';
    buf[1] = b'l';
    buf[2] = b'l';
    buf[3] = b'o';
    buf[4] = b'w';
    buf[5] = b'\n';
}

fn main() {
    let mut buf = Vec::new();
    // 変更してみて。
    // let mut buf = Vec::with_capacity(10);
    read(&mut buf);
    println!("{:?}", buf);
}

これを実行すればわかる。

ご意見募集中

当サイトのリポジトリにて、issue 募集中です!