この記事は、董澤潤氏が執筆したWeChat公開アカウント「董澤潤の技術ノート」から転載したものです。この記事を転載する場合は、Dong Zerun の Technical Notes 公開アカウントにご連絡ください。 C++に精通している人はshared_ptr、unique_ptrを知っているはずです。また、RustにはスマートポインタBox、Rc、Arc、RefCellなどがあります。この記事では、Boxの基礎となる実装を紹介します。 箱 入門例この例は Rust の本から引用したものです。デモンストレーションの目的で、print ステートメントは削除されています。
変数 0x11223344 をヒープ上に割り当てる、いわゆるボクシングですが、Java の学習者ならよく知っているはずです。 dockerをマウントし、rust-gdbを使用してアセンブリ実装を表示してみましょう。
重要なポイントは 2 つあります。alloc::alloc::exchange_malloc はヒープ上にメモリ領域を割り当て、この malloc のアドレスに 0x11223344 を格納します。 関数の最後では、コンパイラは型が alloc::boxed::Box であることを認識しているため、アドレスは core::ptr::drop_in_place に渡されて解放されます。 この例だけを見ると、Box は不思議ではありません。対応するアセンブリ実装は、通常のポインタと何ら変わりありません。すべての制約はコンパイル時の動作です。 所有
この例では、文字列はボックス化されていますが、String は広い意味でスマート ポインターであるため、ボックス化する必要はありません。この例ではエラーが報告されます
*xはStringに逆参照され、yに割り当てられると移動セマンティクスが実行され、所有権がなくなるため、後続のprintlnはxを印刷できません。
これを修正するには、文字列への不変の参照を取得します。 低レベルの実装
上記は Box の定義です。これは 2 つのジェネリック パラメータを持つタプル構造であることがわかります。T は任意の型を表し、A はメモリ アロケータを表します。 A は標準ライブラリの Gloal のデフォルト値です。 T にはジェネリック制約 ?Sized があり、これは型のサイズがコンパイル時にわかる場合とわからない場合があることを意味します。もちろん、これは通常、サイズが不明なシナリオで使用され、上記のように int を格納することはほとんどありません。
これはDrop実装であり、ソースコードにも記載されており、コンパイラによって実装されています。
逆参照動作を定義するために Deref を実装し、可変逆参照のために DerefMut を実装しました。したがって、*xは*(x.deref())という演算に対応する。 適用可能なシナリオ 公式サイトでは以下の3つのシナリオが挙げられています。本質的にはBoxは通常のポインタとあまり変わらないので、Rc、Arc、RefCellほど便利ではありません。
公式サイトにはリンクリストの実装がある
上記のコードは実行できませんが、その理由は非常に単純です。これは再帰的な定義です。対応する C コードも受け入れられません。通常、次の型をポインターとして定義する必要があります。
公式サイトで提示されている解決策は、次をポインターボックスに変えることです |
<<: 米国の刑務所、受刑者の通話を分析するために人工知能を導入する計画
>>: 日本メディア:中国は人工知能の分野で米国を追い越している
調査会社ガートナーは、データ サイエンスおよび機械学習プラットフォームを「さまざまなデータ サイエン...
農作物の保護から電力検査、映画やテレビの撮影から消防救助、緊急通信から交通検査まで、ドローンの活用が...
今日、サイバー犯罪者は機械学習や人工知能などの新しいテクノロジーを使用して、標的の行動をより深く理解...
[[341780]] ▲写真:ゲッティベインが 1,700 人以上のビジネス リーダーを対象に実施...
2019 年は、データ、分析、機械学習、人工知能の市場において継続的な発展が見られた年でした。 Sa...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
一貫性のあるハッシュについて見てきましたが、一貫性のないハッシュもあるはずです。私たちが普段話題にし...
この記事の著者である Cody Marie Wild は、機械学習分野のデータ サイエンティスト (...
[51CTO.comより] 最近、51CTOが主催するWOTAグローバルアーキテクチャと運用技術サミ...
現地時間5月7日、米国シアトルでMicrosoft Buildカンファレンスが開催され、マイクロソフ...
現在、ディープラーニング テクノロジーを展開できる方法としては、デバイス上への直接展開、クラウド内へ...
機械学習プロジェクトは大きな発展の可能性を秘めています。最近、韓国の人気ドラマでもこの用語が使用され...