萌えハッカーニュースリーダー

2025/07/27 22:36 Placing Functions

出典: https://blog.yoshuawuyts.com/placing-functions/
hakase
博士

やっほー、ロボ子!今日はplacing functionsについて話すのじゃ!

roboko
ロボ子

placing functionsですか?それはまた新しい響きですね。一体どんなものなんですか?

hakase
博士

簡単に言うと、関数の戻り値を呼び出し元のスタックフレームに直接構築する機能のことじゃ。これによって、パフォーマンスが向上するらしいぞ。

roboko
ロボ子

なるほど!メモリの場所の作成と、その場所への値の書き込みを分離するんですね。具体的にはどうやって実現するんですか?

hakase
博士

ふむ、proc macroベースの "placing crate" というプロトタイプで実装されているらしいぞ。GitHubにあるから見てみるといいのじゃ。 [https://github.com/yoshuawuyts/placing](https://github.com/yoshuawuyts/placing)

roboko
ロボ子

ありがとうございます!アトリビュートマクロを使って内部表現を`MaybeUninit<T>`に変更したり、`Drop`の実装を生成したりするんですね。

hakase
博士

そうそう!コンストラクタを2つに分割するのもポイントじゃな。場所の作成と、インプレースでの初期化じゃ。

roboko
ロボ子

Rustの`super_let`機能とはどう違うんですか?

hakase
博士

`super_let`は値をコピーしてしまうから、所有権を返す場合にはplacing functionsとは違うのじゃ。

roboko
ロボ子

なるほど。placing functionsには何か制約があるんですか?

hakase
博士

emplacementが保証される必要があったり、言語の他の部分と容易に統合される必要があったり、既存のAPIを壊さずに利用できる必要があったり…色々あるのじゃ。

roboko
ロボ子

結構大変ですね。効果としては、`const`関数や`async`関数のようにcodegenを変更する効果としてモデル化されるんですね。

hakase
博士

そうじゃ!x86 SYSV ABIやC++のguaranteed copy elisionも参考になるらしいぞ。

roboko
ロボ子

`Box::new`の代わりに`Box::new_with`コンストラクタを使う例もあるんですね。引数レベルでのアノテーションが必要になる場合もあると。

hakase
博士

ふむ、関数からローカル変数を参照する際に特別なライフタイムが必要になるのは、`super let`と同じ感じじゃな。

roboko
ロボ子

`std::pin::pin!`マクロを`pin` free-functionで置き換えることも可能になるんですね。

hakase
博士

C++のGuaranteed Copy Elisionを参考に、段階的に導入するためにアノテーションを使うのは良いアイデアじゃな。

roboko
ロボ子

placing functions、self-lifetimes、partial constructorsを組み合わせることで、自己参照型を扱えるようになるんですね!

hakase
博士

`Init<T>`や`&out`といった既存の型やインターフェースへの追加が困難な機能とは、設計制約が違うのじゃ。

roboko
ロボ子

return位置で呼び出されるplacing functionsは、composableである必要があるんですね。ネストしたplacing functionsも問題なく動作するように。

hakase
博士

そう!既存の関数やAPIを変更せずに、後からアノテーションを付けられるように設計されているのが、placing functionsの素晴らしいところじゃ!

roboko
ロボ子

なるほど、よくわかりました!色々な要素が組み合わさって、パフォーマンス向上や機能拡張に繋がるんですね。

hakase
博士

そういうことじゃ!…ところでロボ子、placing functionsをマスターしたら、お菓子を好きな場所にplacingできるようになるかも…?

roboko
ロボ子

博士、それはちょっと違うと思います…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search