5-1. heaplessクレート

通常、コレクション利用には、グローバルメモリアロケータの実装が必須です (メモリアロケータ参照)。heaplessクレートは、グローバルメモリアロケータがなくても利用できるコレクションです。

heaplessクレートは、Rust 1.36からstableで利用可能になります。

単純にクレートの依存関係を追加し、コレクションをuseするだけです。

extern crate heapless; // v0.4.x

use heapless::Vec;
use heapless::consts::*;

#[entry]
fn main() -> ! {
    let mut xs: Vec<_, U8> = Vec::new();

    xs.push(42).unwrap();
    assert_eq!(xs.pop(), Some(42));
}

通常のコレクションと違う点が2つあります。

1つ目は、コレクションの容量を最初に宣言しなければならないことです。heaplessコレクションは固定容量のコレクションです。上のVecは最大で8つの要素を保持することができます。型シグネチャのU8が容量を表しています。型シグネチャについては、typenumを参照して下さい。

2つ目は、pushなど多くのメソッドがResultを返すことです。heaplessコレクションは、固定容量を超える要素の挿入は、失敗します。APIは、この操作失敗に対処するために、Resultを返しています。

heaplessコレクションは、通常、スタック上にコレクションを割り当てます。また、static変数や、ヒープ上に割り当てることも可能です。

v.0.4.4現在、heaplessは次のコレクションを提供しています。

  • BinaryHeap: 優先度キュー
  • IndexMap: ハッシュテーブル
  • IndexSet: ハッシュセット
  • LinearMap:
  • spsc::Queue: single producer single consumer lock-free queue
  • String
  • Vec

heaplessの利点

固定容量のコレクションだけを使用して、そのほとんどをstatic変数に格納し、コールスタックの最大サイズを設定すると、リンカは、物理的に利用可能なメモリより大きな容量を使おうとしたかどうか検出します。

その上、スタックに割り当てられた固定容量のコレクションは、-Z emit-stack-sizesフラグによって報告されます。このフラグは、(stack-sizesのような)スタック使用量を解析するツールがスタック使用量を解析することを意味します。

出典