r/rust🔥 207
💬 30

Rustの「Allocator」APIがついに安定版へ!メモリ管理の次なる一手

N911999
約21時間前

ディスカッション (31件)

0
N911999OP🔥 207
約21時間前

RustにおけるAllocator APIが安定化(Stabilize)されました。これにより、独自のメモリ確保戦略をRustの標準ライブラリとより深く統合できるようになり、システムプログラミングの柔軟性がさらに向上します。

1
Compux72👍 51
約21時間前

待って、これマジかよ??

最高すぎるだろ!!!!!

2
Hedshodd👍 77
約21時間前

よし!本当に素晴らしいニュースだ。これに取り組んでくれた人たち、そしてフィードバックをくれたみんなに感謝!

3
Fazer2
👍1約20時間前

まだマージされてないよね。どれくらい時間がかかるか分かってる人いる?

4
kibwen
👍5約17時間前

説明によると、最近のRust All Handsでlibsチームの対面会議で議論されて、関係者の間で大筋で合意が取れてるみたいだよ。この土壇場で大きな反対がなければ、早ければ火曜の次回のlibsチーム会議でFinal Comment Period(最終コメント期間)として承認されるかも。そうなれば、ブロックするような懸念を挙げるための猶予期間がさらに10日間できるはず。

5
protestor
👍32約21時間前

/u/matthieum が提案してたもう一つのStorageデザインはどうなったの?あれは「却下」されたのか、それとも将来的に必要であればアロケータAPIと互換性を持たせることができるものなのかな?

https://github.com/matthieu-m/storage-poc
https://github.com/matthieu-m/storage

https://internals.rust-lang.org/t/pre-rfc-storage-api/18822

https://github.com/matthieu-m/storage/blob/main/etc/rfc.md

hackmdに載ってるのはここ https://hackmd.io/YeSBtnK_T1ay0Is9DjTZug#Why-now だけだけど、インラインストレージを許容できるくらい柔軟なストレージAPIみたいなものが、将来的にアロケータAPIの上に追加できるのか、それともストレージAPI自体が完全に破棄されたのかが書かれていないんだよね。

6
N911999
👍26約21時間前

PRにリンクされているhackmd.io を見てみて。Existing-points-of-contention(既存の論点)セクションの最後の項目にその件について書かれているよ。

7
protestor
👍9約21時間前

おー、なるほど!ありがとう!

8
CAD1997
👍48約20時間前

その場にいたけど、将来的に何らかのストレージの形を望んでいるもう一人の主要な声が私だよ。supertrait item shadowingとsupertrait auto-implsさえあれば、storage APIはAllocatorの安定化と完全に後方互換性があるって再確認できた。ライブラリ側も他の多くの理由でこれを求めているしね。それに、storage APIが許容するオプションを全部盛り込むと、結果的にAllocatorとほぼ同じAPIになる。このトレイトは実質「PinningMultiStorage」のようなものだと考えていいよ。

9
ROBOTRON31415
👍10約21時間前

…うわっ

あと数年はかかるものだと完全に思ってた

やったね!

10
Dreaming_Desires
👍2約21時間前

これの利点は何?

11
jorgecardleitao
👍12約21時間前

OS開発をサポートするフォールダブル(失敗しうる)アロケータってこと?

12
sw17ch
👍14約20時間前

仕事でこれを使う予定だよ。グローバルアロケータを特定のカウント用アロケータでラップして、メモリがどれだけ確保・解放されたかをバイト単位で集計することで、各機能がどれだけメモリを消費しているかを確認するのに役立てるつもり。

13
Sharlinator
👍25約20時間前

システムヒープのアロケータ以外を使えるっていうのは、多くのアプリケーションにとってめちゃくちゃ重要な機能だよ。Rustではグローバルにカスタムアロケータを設定できるけど、実際にはアロケータの種類ってその場のコンテキストに依存することが多いよね。現状のStableなRustだと、bumpaloみたいなライブラリを使わない限りそれができなくて、結局Vec API全体を複製して非標準のメモリ確保に対応するみたいな面倒なことをしなきゃいけないんだ。

14
ZZaaaccc
👍6約19時間前

Allocatorはcoreで定義されているから、グローバルアロケータを全く定義せずに(allocやstdにリンクせずに)ヒープ確保を使いやすくできる道が開けるんだよ。BoxやVecのようなアロケートを行うADTをcoreに移動できる可能性が出てきたってこと。

15
TDplay
👍5約18時間前

メモリ割り当てって万能なやり方なんてないからね。それぞれメリット・デメリットがある選択肢がたくさんあるし。

フリーリストアロケータは一番汎用的だね(実際、ほとんどのシステムでmallocはフリーリストアロケータを使ってる)。でも低速なんだよ。割り当てるたびに、システムは適切な空きメモリが見つかるまで全領域のリストをチェックしないといけないから。それに、特に小さいアドレス空間だとヒープの断片化も起きやすい。

だからAllocatorトレイトを使えば、もっと細かいレベルでアロケータを選べるようになるんだ。例えば、プログラムの中で一括解放できるような割り当てを大量に行う場所があるなら、バンプアロケータを使うとかね。あるいは似たようなレイアウトの割り当てがたくさんあるなら、スラブアロケータにまとめるといった具合に。

16
Sharlinator
👍8約21時間前

衝撃的だわ。

17
Lostx
👍23約20時間前

注意点としては、これがカバーしているのはVecとBoxだけだってことかな。カスタムアロケートされたHashMapやBTreeMapを使いたいなら、当面はhashbrownとallocator_api2にお世話になることになるはず。今回のPRはスコープを最小限に抑えることが明記されているからね。あと、dyn-incompatibleなのもそのままだから、多くのユーザーには問題ないだろうけど、トレイトオブジェクトの裏で実行時にアロケータを入れ替えたいっていう人にはかなり痛いギャップかも。ちなみに、私はforge-alloc(https://github.com/dmaesj/forge-alloc) でアロケータの実験をしていて、これはStableでallocator_api2にブリッジするコンポーザブルなアロケータキットなんだ。これがリリースされたら、余計な間接参照を捨てて直接Vec::new_inに渡せるようになるから、そこは本当にワクワクしてる。結局「既存のstdのデータ構造にどうやってカスタムアロケータを組み込むか」という摩擦こそが、このPRで解消される本質的な部分だよね。

18
coolreader18
👍6約20時間前

まあ、hashbrownは次のバージョンアップでstdのAllocatorに切り替えてくるんじゃないかな。

19
Lostx
👍1約16時間前

本当にその通り。allocator_api2はずっとnightlyトレイトのミラーでしかなかったから、hashbrownにとってはポートというより機能フラグを切り替えるようなものだよね。

20
victory_and_death
約19時間前

なんでそんなClaudeみたいな書き方でRedditのコメントしてるの?

21
6501
👍9約19時間前

AIがRedditのコメントを学習データにしてるからね...

22
mattsowa
約18時間前

なんで低評価ついてるのか分からん。めちゃくちゃ分かりやすい説明なのに。

23
victory_and_death
👍2約18時間前

うん、Claudeって「genuinely」「explicit about...」「actually fixes」「a real gap」みたいな表現を使いすぎる傾向あるよね。

24
PurpleOstrich97
👍7約20時間前

取り組んでいるプロジェクトのいくつかにとって、これはめちゃくちゃデカいよ。すごく楽しみ!

25
cmrschwarz
👍20約19時間前

Deallocatorが入らなかったのは正直かなりショックだな。hackmd(https://hackmd.io/YeSBtnK_T1ay0Is9DjTZug#Existing-points-of-contention) に書かれている理由は、どうにも納得できないよ。Arena/Bumpアロケータってそんなに稀なケースじゃなくて、カスタムアロケータを使う主な理由の一つでしょ。本当に、たった一つのトレイトを追加するのが複雑すぎるっていうのが理由なの?今まさにカスタムメモリアロケータを書いてるユーザーに対して?エコシステムの大部分が結局カスタムのBoxやRc型を使い続けることになるなら、これじゃ標準化のメリットが台無しで、全く意味がない気がするんだけど。私が間違っててくれるといいんだけどね。

26
kibwen
👍3約17時間前

つまりこれ、将来的に後方互換性を保ったまま実現できるってことだよね?

27
Plazmatic
👍1約16時間前

なんでそんなに怒ってるのかよく分からないな。彼らは将来的に追加できるって明確に言ってるわけだし、デアロケータトレイトまわりの議論や不明点だけで今回の進歩を止めるべきじゃないでしょ:

Deallocatorトレイトを分離する
trait Allocator: Deallocator {...}
特定のケース(例えばバンプアロケータ)では、割り当てよりも解放の方が情報が少なくて済むし、なんなら何もしなくていい(no-op)場合もある
APIの複雑性が少し増すし、2つのトレイトを実装しなきゃいけないのはエルゴノミクス的にちょっと残念
別案として、とりあえず今のままAllocatorを安定化させて、詳細は後回しにするのもアリ(GitHubのコメント参照)
将来的にsupertraitの自動実装でより綺麗にできるはずだし、後から切り替えても破壊的変更にはならないはず
おそらくCollection<T, A: Allocator>をA: Deallocatorに緩和する方法について、APIのbikeshedding(些末な議論)がたくさん必要になるだろうけど
https://github.com/rust-lang/libs-team/issues/769

28
Thermatix
👍3約18時間前

よく分からない人(自分含め)のために聞くけど、これって何でそんなに重要だったり凄かったり、役に立ったりするの?

29
DistinctStranger8729
👍2約18時間前

よっしゃあああ!最高!