Rustは、ガベージコレクションされるヒープ上のオブジェクトを参照する、記述されたマネージポインターを使用します。@T
また、借用したポインタ、書かれた&T
、またはを使用します&lifetime/T
。
実際に@T
は借用したポインタに似ていますが、特別な無限の寿命があります。それは正しいですか、それとも私がまだ得ていない微妙な点がいくつかありますか?それが正しければ、なぜRustの設計者は、魔法の寿命を導入する代わりに、新しいタイプのポインターを作成したのでしょうか。
Rustは、ガベージコレクションされるヒープ上のオブジェクトを参照する、記述されたマネージポインターを使用します。@T
また、借用したポインタ、書かれた&T
、またはを使用します&lifetime/T
。
実際に@T
は借用したポインタに似ていますが、特別な無限の寿命があります。それは正しいですか、それとも私がまだ得ていない微妙な点がいくつかありますか?それが正しければ、なぜRustの設計者は、魔法の寿命を導入する代わりに、新しいタイプのポインターを作成したのでしょうか。
序文:Rustはまだ開発中であり、この質問に答えてから言語が大きく変わりました。
1つは、@ポインターが言語から削除され、標準ライブラリによって提供されるGcおよびRcスマートポインターに置き換えられることです。
次に、ライフタイムの構文はになりました&'a pointer
。References and Lifetimes Guideは、このテーマに関する包括的でよく書かれたリソースです。
これらの2つの点を考慮に入れれば、私の答えの内容は依然として適切です。
Rustには、メモリを割り当てる3つの方法があります。
T
)。これはCと同じです。@T
)。このメモリは、他のGC言語と同様に、ガベージコレクションされます。~T
)。この記憶の寿命は、誰がそれを所有しているかによって異なります。次に、割り当ての種類に応じて、ポインター(-allocated値のみ)、ポインター(-allocated値のみ)、ポインター(借用ポインター)、またはポインター(安全でない)のいずれかを使用して、値への@
参照@
を~
保持~
でき&
ます*
。ポインタ)。
let x: @int = @2;
この例では、最初の例@
はポインタータイプを示し、2番目の例は割り当てタイプを示します。これは、@
GCの値へのポインタです。
let y: &int = @2;
これは、&
GCされた値へのポインタです。
&
-ポインタは、あらゆるタイプのメモリを参照できるため、便利です。関数を作成するときは、パラメーターを&
-pointerとして宣言する必要があります。これは、呼び出し元が、必要な方法で割り当てられた値を使用して関数を呼び出すことができるためです。関数がパラメーターを@
ポインターとして宣言している場合、呼び出し元はヒープに割り当てられた値を渡す以外に選択肢はありません。
&
-ポインタは寿命の概念を導入します。これは、これらのポインタが割り当てられたメモリよりも長持ちしないことを保証するためにコンパイラによって使用される概念です(したがって、「安全な」ポインタになります)。
割り当てられた値の「存続期間」は@
コンパイラーによって認識されません。コンパイラーによって静的に決定されるのではなく、ランタイムによって動的に決定されます。
私はRustの専門家ではありません。ただ興味があるので、私の答えを最終的な真実として数えないでください。
穴を掘ったポインタの寿命は定義されていない可能性があることを私は理解しているので、それは推測することしかできません。また、この宣言&lifetime/Pointer
は、チェッカーがライフタイム分析で使用する実際のポインターのライフタイムを決定するのに役立つだけです。したがって、穴を掘ったポインタの一部に無限のライフタイムがあるとは言えません。すでに存在するライフタイムしか使用できません。
穴を掘られたポインタは、常に有効なメモリを指すことが静的に証明されていることを除いて、他の言語では弱いポインタと見なされる可能性があります。したがって、存続期間が無限の穴を掘ったポインタは、オブジェクトを所有していないため、マネージポインタと同じにはなりません。
このトピックに関する私の情報源は、Rust BorrowedPointersTutorialです。読んだことがありますか?