タグ

ブックマーク / qiita.com/qnighy (5)

  • Rustで相互参照: ノーガード戦法編 - Qiita

    RustはトレースGCを持たずRAIIと所有権に基づくメモリ管理を行います。これには様々な利点がある一方、相互参照をもつデータの扱いが他のプログラミング言語より難しいという困難があります。記事では、あまり一般的ではないが特定の限られた用途では有用と思われる方法を紹介します。 標準的な方法 まずは相互参照が起きないように設計を再考するのがいいでしょう。特に「子データから親データを参照する」といったユースケースでは、必ずしも子データ自体が親データへの参照を持たなくてもいいことがあります。以下ではこれに当てはまらない例、典型的にはグラフの表現を念頭に置いて記述します。 Rustで相互参照を扱う最も標準的な方法は、typed_arenaなどのアリーナアロケーターと RefCellなどの内部可変性コンテナを組み合わせる方法です。これについては私のブログ記事などを参考にしてください。 またRust

    Rustで相互参照: ノーガード戦法編 - Qiita
  • 並列Rustコンパイラ(β)を試そう! - Qiita

    概要: Rustコンパイラはすでに部分的に並列に動作していますが、命であるフロントエンドの並列化の実用化が進んでいます。エンドユーザーが気軽に試せる状況になったようなので紹介します。 12月7日のアドベントカレンダーの枠が空いていたので、かわりに書きました。(執筆日は12月21日です) 端的に言うと internalsのアナウンス記事に全てがまとまっています。以下のようにして「並列化対応版」と「並列化未対応版」の両方でコンパイルして、その結果を比較することができます。 $ rustup update nightly-2019-12-18 $ rustup update nightly-2019-12-17 $ cargo +nightly-2019-12-18 build $ cargo +nightly-2019-12-17 build コンパイル結果がおかしくないか、またコンパイル時

    並列Rustコンパイラ(β)を試そう! - Qiita
  • Rustの `Arc` を読む(1): Arc/Rcの基本 - Qiita

    概要: Rustの Arc 型の実装は宝の宝庫です。そこで、これを隅から隅まで解説してみます。 第1回「Arc/Rcの基」では、実際に Arc のソースを読む前に Arc/Rc の使い方を解説します。 第1回 Arc/Rcの基 第2回 Rcを読む基編 第3回 Rcを読む発展編 第4回 アトミック変数とメモリ順序 第5回 Arcを読む はじめに Arc<T> はRustの基的な型のひとつですが、 Box<T> のようにコンパイラに特別扱いされているわけでもなく、実装も比較的コンパクトです(コメントやテスト、安定性に関する指示などを除いて500LOC程度) その一方で Arc は並行性制御や Deref, ドロップチェッカー, Unpin, Layoutの扱いなどRustをよりよく理解するための題材を多く含んでいます。そこで記事では Arc<T> の実装を読んでいきます。 とはいえ、

    Rustの `Arc` を読む(1): Arc/Rcの基本 - Qiita
  • Rustスマートポインタ比較表 - Qiita

    以下補足です。 効率 トレードオフを強調するために、相対的な効率を星の個数で表しています。しかし、効率をことさら気にする必要はありません。他の多くのプログラミング言語では、Rustでいうところの Arc<Mutex<T>> をデフォルトで使っているような状況です。要件にあったものを使うことが大事です。 ライフタイム 「短命」とついているものは基的に、ある関数のスコープに紐付いた形でしか使えません。特に慣れないうちは、これらの型を構造体に入れて使うのはやめておいたほうが無難でしょう。 例外として、グローバル変数 (static, lazy_static!) は &'static 参照として扱うことができます 共有 「ポインタ」と聞くと、参照先が共有されている様子を思い浮かべる人が多いと思いますが、所有権の概念のあるRustでは必ずしもそのイメージは当てはまりません。 &mut T と Bo

    Rustスマートポインタ比較表 - Qiita
  • Rustのasync/awaitをスムーズに使うためのテクニック - Qiita

    RustのFutureとasync/awaitは、「時間のかかる処理」をするときに、「処理が終わるまでOSスレッドをブロックする(同期Rust)」のではなく、「当該処理を中断して、そのOSスレッドを別のタスクの処理に使う(非同期Rust)」ことで、スレッド数よりも多くの処理を同時に行う仕組みです。 同期Rustと非同期Rustには以下のようなアナロジーが成立します。 同期Rust 非同期Rust

    Rustのasync/awaitをスムーズに使うためのテクニック - Qiita
  • 1