ディスカッション (31件)
RustにおけるAllocator APIが安定化(Stabilize)されました。これにより、独自のメモリ確保戦略をRustの標準ライブラリとより深く統合できるようになり、システムプログラミングの柔軟性がさらに向上します。
待って、これマジかよ??
最高すぎるだろ!!!!!
よし!本当に素晴らしいニュースだ。これに取り組んでくれた人たち、そしてフィードバックをくれたみんなに感謝!
まだマージされてないよね。どれくらい時間がかかるか分かってる人いる?
説明によると、最近のRust All Handsでlibsチームの対面会議で議論されて、関係者の間で大筋で合意が取れてるみたいだよ。この土壇場で大きな反対がなければ、早ければ火曜の次回のlibsチーム会議でFinal Comment Period(最終コメント期間)として承認されるかも。そうなれば、ブロックするような懸念を挙げるための猶予期間がさらに10日間できるはず。
/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自体が完全に破棄されたのかが書かれていないんだよね。
おー、なるほど!ありがとう!
その場にいたけど、将来的に何らかのストレージの形を望んでいるもう一人の主要な声が私だよ。supertrait item shadowingとsupertrait auto-implsさえあれば、storage APIはAllocatorの安定化と完全に後方互換性があるって再確認できた。ライブラリ側も他の多くの理由でこれを求めているしね。それに、storage APIが許容するオプションを全部盛り込むと、結果的にAllocatorとほぼ同じAPIになる。このトレイトは実質「PinningMultiStorage」のようなものだと考えていいよ。
…うわっ
あと数年はかかるものだと完全に思ってた
やったね!
これの利点は何?
OS開発をサポートするフォールダブル(失敗しうる)アロケータってこと?
仕事でこれを使う予定だよ。グローバルアロケータを特定のカウント用アロケータでラップして、メモリがどれだけ確保・解放されたかをバイト単位で集計することで、各機能がどれだけメモリを消費しているかを確認するのに役立てるつもり。
システムヒープのアロケータ以外を使えるっていうのは、多くのアプリケーションにとってめちゃくちゃ重要な機能だよ。Rustではグローバルにカスタムアロケータを設定できるけど、実際にはアロケータの種類ってその場のコンテキストに依存することが多いよね。現状のStableなRustだと、bumpaloみたいなライブラリを使わない限りそれができなくて、結局Vec API全体を複製して非標準のメモリ確保に対応するみたいな面倒なことをしなきゃいけないんだ。
Allocatorはcoreで定義されているから、グローバルアロケータを全く定義せずに(allocやstdにリンクせずに)ヒープ確保を使いやすくできる道が開けるんだよ。BoxやVecのようなアロケートを行うADTをcoreに移動できる可能性が出てきたってこと。
メモリ割り当てって万能なやり方なんてないからね。それぞれメリット・デメリットがある選択肢がたくさんあるし。
フリーリストアロケータは一番汎用的だね(実際、ほとんどのシステムでmallocはフリーリストアロケータを使ってる)。でも低速なんだよ。割り当てるたびに、システムは適切な空きメモリが見つかるまで全領域のリストをチェックしないといけないから。それに、特に小さいアドレス空間だとヒープの断片化も起きやすい。
だからAllocatorトレイトを使えば、もっと細かいレベルでアロケータを選べるようになるんだ。例えば、プログラムの中で一括解放できるような割り当てを大量に行う場所があるなら、バンプアロケータを使うとかね。あるいは似たようなレイアウトの割り当てがたくさんあるなら、スラブアロケータにまとめるといった具合に。
衝撃的だわ。
注意点としては、これがカバーしているのは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で解消される本質的な部分だよね。
まあ、hashbrownは次のバージョンアップでstdのAllocatorに切り替えてくるんじゃないかな。
本当にその通り。allocator_api2はずっとnightlyトレイトのミラーでしかなかったから、hashbrownにとってはポートというより機能フラグを切り替えるようなものだよね。
なんでそんなClaudeみたいな書き方でRedditのコメントしてるの?
AIがRedditのコメントを学習データにしてるからね...
なんで低評価ついてるのか分からん。めちゃくちゃ分かりやすい説明なのに。
うん、Claudeって「genuinely」「explicit about...」「actually fixes」「a real gap」みたいな表現を使いすぎる傾向あるよね。
取り組んでいるプロジェクトのいくつかにとって、これはめちゃくちゃデカいよ。すごく楽しみ!
Deallocatorが入らなかったのは正直かなりショックだな。hackmd(https://hackmd.io/YeSBtnK_T1ay0Is9DjTZug#Existing-points-of-contention) に書かれている理由は、どうにも納得できないよ。Arena/Bumpアロケータってそんなに稀なケースじゃなくて、カスタムアロケータを使う主な理由の一つでしょ。本当に、たった一つのトレイトを追加するのが複雑すぎるっていうのが理由なの?今まさにカスタムメモリアロケータを書いてるユーザーに対して?エコシステムの大部分が結局カスタムのBoxやRc型を使い続けることになるなら、これじゃ標準化のメリットが台無しで、全く意味がない気がするんだけど。私が間違っててくれるといいんだけどね。
つまりこれ、将来的に後方互換性を保ったまま実現できるってことだよね?
なんでそんなに怒ってるのかよく分からないな。彼らは将来的に追加できるって明確に言ってるわけだし、デアロケータトレイトまわりの議論や不明点だけで今回の進歩を止めるべきじゃないでしょ:
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
よく分からない人(自分含め)のために聞くけど、これって何でそんなに重要だったり凄かったり、役に立ったりするの?
よっしゃあああ!最高!
I-unsound系のイシューってまだいくつか残ってなかったっけ?少なくともパッと見で些細そうなやつは、これより先に修正がマージされるのかも?
https://github.com/rust-lang/rust/issues?q=is%3Aissue%20state%3Aopen%20label%3AI-unsound