公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※次スレは原則>>980が立てること
前スレ
Rust part16
探検
Rust part17
■ このスレッドは過去ログ倉庫に格納されています
2022/10/06(木) 22:43:13.96ID:Re0G7B20
2022/10/07(金) 21:18:22.03ID:7pvxFIpA
まとめると実行時に値を書き換えたいオブジェクトにはCellを使う
書き込む場合はset
読み込む場合はtakeを使う
RefCellはオワコン
書き込む場合はset
読み込む場合はtakeを使う
RefCellはオワコン
2022/10/07(金) 21:30:00.49ID:Znh4X5V+
>>40
内部可変性を知らないのかな?
Cellは内部可変性を与えるものであり
& mutに縛られずにコーディングの自由度を上げるだけでなく
この内部可変性を使わないと記述できない場合もあるほど重要なもの
内部可変性を知らないのかな?
Cellは内部可変性を与えるものであり
& mutに縛られずにコーディングの自由度を上げるだけでなく
この内部可変性を使わないと記述できない場合もあるほど重要なもの
2022/10/07(金) 22:49:11.13ID:xg0qXK5h
> inherited mutability is preferred, and interior mutability is something of a last resort.
内部可変性は必要な時だけつかうべき
https://doc.rust-lang.org/std/cell/
内部可変性は必要な時だけつかうべき
https://doc.rust-lang.org/std/cell/
44デフォルトの名無しさん
2022/10/07(金) 23:05:27.46ID:3/fEI9MA スレッド間での共有ができないからその場合は内部可変性を避けないとコンパイルエラーとなっちゃう
しかし共有しないものならばいつでも安全に使うことが出来ます
不自由なプログラミングをしてまで内部可変性の利用を避ける必要はありません
そのような場合にはむしろ使うべき時ですよ
しかし共有しないものならばいつでも安全に使うことが出来ます
不自由なプログラミングをしてまで内部可変性の利用を避ける必要はありません
そのような場合にはむしろ使うべき時ですよ
2022/10/07(金) 23:15:28.30ID:GE9TWYxP
The Bookの内容も理解してないようだから厨二病というより厨一病だねぇ
2022/10/07(金) 23:27:40.94ID:Znh4X5V+
2022/10/07(金) 23:41:21.31ID:xg0qXK5h
>>46
!Syncが許容される場面では常にCellを使うべきだと考えていますか?
!Syncが許容される場面では常にCellを使うべきだと考えていますか?
2022/10/07(金) 23:44:26.62ID:Znh4X5V+
2022/10/07(金) 23:59:28.46ID:v90MyUH0
Cellは安全なだけでなく
実行コストもかからないし
データ設計の幅も広がるし
メリットだらけだよね
実行コストもかからないし
データ設計の幅も広がるし
メリットだらけだよね
2022/10/08(土) 00:00:53.53ID:74M5kg9b
後で読むからブログにでもまとめといて
2022/10/08(土) 00:05:55.63ID:PJN/h6/8
Cellを嫌ってる人って何かの病気なの?
数ある型の一つに過ぎないのに
数ある型の一つに過ぎないのに
2022/10/08(土) 00:09:24.75ID:STUNJ/8C
2022/10/08(土) 00:21:36.43ID:iVJbbbtq
Cell使わずにshared xor mutableの制限で苦しんでいる人は単なるバカ
2022/10/08(土) 00:35:12.49ID:D3DCz8sQ
CellとかRefCellってRustの本にも殆ど解説がないよな
ちょろっとおまけ程度にしかない
これなしでは現実的なプログラム書けないと思うのだが本の著者らはRustを理解してないんだろうか
ちょろっとおまけ程度にしかない
これなしでは現実的なプログラム書けないと思うのだが本の著者らはRustを理解してないんだろうか
2022/10/08(土) 00:52:04.60ID:2tIWkITu
>>54
書籍は見たことないから知らなかったけどそうなのか
自分が使っている著名なcratesのソースを見てみるとCellを使っているcrateも多い
だから普通に皆がCellを使っていてそこにタブーは無いようだ
まあ当たり前か
書籍は見たことないから知らなかったけどそうなのか
自分が使っている著名なcratesのソースを見てみるとCellを使っているcrateも多い
だから普通に皆がCellを使っていてそこにタブーは無いようだ
まあ当たり前か
2022/10/08(土) 00:58:18.16ID:QzbKhEyQ
Cellなしでは現実的なプログラム書けないというのは言い過ぎ
ある種のプログラムではCellが必要になるくらいが適当では
ある種のプログラムではCellが必要になるくらいが適当では
2022/10/08(土) 01:04:15.77ID:2tIWkITu
Cellが必須となるプログラムと
Cellが必須でないプログラムがあるだけだよな
まあこれも当たり前かw
Cellが必須でないプログラムがあるだけだよな
まあこれも当たり前かw
58デフォルトの名無しさん
2022/10/08(土) 01:12:26.49ID:M3iYd9Ol Rustで日本が変わる!世界が変わる!
などとほざいてる人は自分では使っていないと思う。
使ってたら、ウーン、こりゃ使えんなあ・・・って言ってると思う。
などとほざいてる人は自分では使っていないと思う。
使ってたら、ウーン、こりゃ使えんなあ・・・って言ってると思う。
2022/10/08(土) 01:34:11.88ID:2tIWkITu
Rustは今までに登場したプログラミング言語の中では一番使いやすく効率がいい程度だな
世界や日本がどうなろうとどうでもいいが
理解できない人たちとの不利有利の二極化は起こるだろう
世界や日本がどうなろうとどうでもいいが
理解できない人たちとの不利有利の二極化は起こるだろう
2022/10/08(土) 03:41:06.69ID:D3DCz8sQ
2022/10/08(土) 05:12:58.83ID:ci/6kpez
各crateのソース調べたらtokioもasync-stdもwasm-bindgenもCell使ってるな
別方面でtauriもyewもeguiもCell使ってるな
他にもproc macro用のsynとかCLI用のclapとか様々なcrateがCell使ってるな
この状況を見るとCellは普通に使って当然っぽい
別方面でtauriもyewもeguiもCell使ってるな
他にもproc macro用のsynとかCLI用のclapとか様々なcrateがCell使ってるな
この状況を見るとCellは普通に使って当然っぽい
62デフォルトの名無しさん
2022/10/08(土) 10:23:03.05ID:2effy6oa >>38
それってCellから取り出した値がdefaultだった時の処理を書かないとならないんじゃないんですか?
それってCellから取り出した値がdefaultだった時の処理を書かないとならないんじゃないんですか?
2022/10/08(土) 10:55:13.71ID:/5aPtbi3
2022/10/08(土) 10:59:24.30ID:HCP3bqwV
Cellはスレッドローカルの共有状態を管理する時に使う
カウンタとかフラグとか
shared mutability自体多用するもんじゃないからその辺をよく考えてね
カウンタとかフラグとか
shared mutability自体多用するもんじゃないからその辺をよく考えてね
2022/10/08(土) 10:59:37.80ID:kYZ69ulT
>>54
Cの入門本の8割はmallocの使い方を説明してない
Cの入門本の8割はmallocの使い方を説明してない
2022/10/08(土) 13:18:33.57ID:HbWzH6SV
どうせなら不変な部分を取り出せるようにしてすればよかったのにな。
参照カウントみたいなどこでも付いて回るのは厄介だけど。
参照カウントみたいなどこでも付いて回るのは厄介だけど。
2022/10/08(土) 13:48:31.81ID:D3DCz8sQ
2022/10/08(土) 14:04:15.39ID:cMY3Tlwa
カジュアルにCellを使って欲しくないからだよ
よく考えて使わないとバグのもとだから
必要な人向けにはリファレンスで詳しく解説してる
よく考えて使わないとバグのもとだから
必要な人向けにはリファレンスで詳しく解説してる
2022/10/08(土) 18:26:38.20ID:r98Hfriq
>>62
マルチスレッド間共有していないから
空っぽの時に知らぬ間にアクセスされることはないよ
だから大丈夫
そしてすぐに更新することで最適化される
あとはプログラムの組み立て方の話であって言語による管轄の話ではないね
マルチスレッド間共有していないから
空っぽの時に知らぬ間にアクセスされることはないよ
だから大丈夫
そしてすぐに更新することで最適化される
あとはプログラムの組み立て方の話であって言語による管轄の話ではないね
2022/10/08(土) 19:07:57.58ID:vMI7I1P7
interior mutabilityを持ち所有権を自分が持たないケースは特殊だから説明した方がいいかもしれないが、
interior mutabilityを持ち所有権を自分が持つケースは普通の事だからわざわざ説明するまでもない。
write lockを取るからborrow checkが実行時に遅延されるのも説明しないといけないし。
interior mutabilityを持ち所有権を自分が持つケースは普通の事だからわざわざ説明するまでもない。
write lockを取るからborrow checkが実行時に遅延されるのも説明しないといけないし。
2022/10/08(土) 19:14:27.64ID:N7i/LeD2
Cellの使い方教えればRustユーザーも増えると思うな
所有権そのものより副作用を簡単には許さないところにハードルがあるから
所有権そのものより副作用を簡単には許さないところにハードルがあるから
2022/10/08(土) 19:30:29.77ID:Xn47a3bW
2022/10/08(土) 20:24:05.46ID:QzbKhEyQ
カジュアルに使うならマルチスレッドでも使えるMutex使っておけばよいのではという気もするが
2022/10/08(土) 21:19:30.79ID:BDP0djZ+
CellはCにおけるグローバル変数と同じで真に必要な時以外は極力避けるべきもの
ましてやRustの基本的考え方に慣れてないうちから使うべきものじゃない
ましてやRustの基本的考え方に慣れてないうちから使うべきものじゃない
2022/10/08(土) 22:01:30.85ID:LnEoG2Yz
2022/10/08(土) 22:04:07.45ID:QzbKhEyQ
>>75
ロックのオーバーヘッドを気にする必要があるのはカジュアルに含まれません
ロックのオーバーヘッドを気にする必要があるのはカジュアルに含まれません
2022/10/08(土) 22:06:04.90ID:aSXXl0gc
immutableなのがいいと言いつつ
mutやinterior mutabilityを結局使わせるダサさなw
mutやinterior mutabilityを結局使わせるダサさなw
2022/10/08(土) 22:39:37.88ID:K1piK/7g
>>76
Cell<T>ならスレッド内部専用の代わりにロックがなくてTと同じコストで使えるからオススメ
Cell<T>ならスレッド内部専用の代わりにロックがなくてTと同じコストで使えるからオススメ
2022/10/08(土) 22:40:45.08ID:QzbKhEyQ
immutableだけで書きたければそうすれば良いのでは
そのアプローチに窮屈さを感じる人が大半だからshared xor mutableという安全に使えるサブセットが生み出されたわけで
そのアプローチに窮屈さを感じる人が大半だからshared xor mutableという安全に使えるサブセットが生み出されたわけで
2022/10/08(土) 22:42:33.20ID:QzbKhEyQ
>>78
ただしマルチスレッド対応させようとすると書き換えが必要だし性能面に大きなこだわりがないなら最初からMutexにした方が良いのでは
Cell<T>はランタイムコスト面ではTと同じかもしれないけどコード記述は結局
ただしマルチスレッド対応させようとすると書き換えが必要だし性能面に大きなこだわりがないなら最初からMutexにした方が良いのでは
Cell<T>はランタイムコスト面ではTと同じかもしれないけどコード記述は結局
2022/10/08(土) 22:43:05.48ID:QzbKhEyQ
途中で書き込んでしまった
コードの記述の面ではTとは異なるから同じ使い心地にはならないよね
コードの記述の面ではTとは異なるから同じ使い心地にはならないよね
2022/10/08(土) 22:53:58.00ID:IDy6SwOh
>>80
それは君が勘違いをしている
Cellはマルチスレッドであってもスレッド内で使用することができる
Mutexを使うべき時はマルチスレッドのスレッド間で共有メモリとする時
排他制御のためMutexはコストが重い
したがって両者を互いに代用することは有り得ない
それは君が勘違いをしている
Cellはマルチスレッドであってもスレッド内で使用することができる
Mutexを使うべき時はマルチスレッドのスレッド間で共有メモリとする時
排他制御のためMutexはコストが重い
したがって両者を互いに代用することは有り得ない
2022/10/09(日) 00:09:47.59ID:RlW+XoWS
よくわかんないんだけどMutex<Cell<T>>は有効なの?
2022/10/09(日) 01:31:18.81ID:LqCUQ5jH
>>83
無効ではない
しかしMutex<T>はlockを取れたら& mut Tも得られて書き込みも可能なのでCellは不要
例えば
fn main() {
let m = Mutex::new(Vec::new());
sub(&m);
let v = m.lock().unwrap();
assert_eq!(*v, [123, 456]);
}
fn sub(m: &Mutex<Vec<i32>>) {
let mut v = m.lock().unwrap();
v.push(123);
v.push(456);
}
つまりMutexの可変参照をもっていなくても内部の可変性を得られる
ようするにCellで内部可変性を得られるのと同じ
だからMutex<Cell<T>>と二段に重ねる必要はない
無効ではない
しかしMutex<T>はlockを取れたら& mut Tも得られて書き込みも可能なのでCellは不要
例えば
fn main() {
let m = Mutex::new(Vec::new());
sub(&m);
let v = m.lock().unwrap();
assert_eq!(*v, [123, 456]);
}
fn sub(m: &Mutex<Vec<i32>>) {
let mut v = m.lock().unwrap();
v.push(123);
v.push(456);
}
つまりMutexの可変参照をもっていなくても内部の可変性を得られる
ようするにCellで内部可変性を得られるのと同じ
だからMutex<Cell<T>>と二段に重ねる必要はない
2022/10/09(日) 01:46:07.36ID:NMoxe/se
2022/10/09(日) 01:48:31.99ID:2Hsnp4rW
>>82
ランタイムコストが無視できる場合はMutexが使えるけどCellが使えないシチュエーションはないよね
カジュアル用途なら大は小を兼ねる的な意味でCellよりMutexの方が良いのでは?
Cellにすべき理由あるの?
ランタイムコストが無視できる場合はMutexが使えるけどCellが使えないシチュエーションはないよね
カジュアル用途なら大は小を兼ねる的な意味でCellよりMutexの方が良いのでは?
Cellにすべき理由あるの?
2022/10/09(日) 01:49:26.64ID:2Hsnp4rW
>>86
一文目逆だった。MutexがCellを置き換えられない場合はないよね、と言いたかった
一文目逆だった。MutexがCellを置き換えられない場合はないよね、と言いたかった
2022/10/09(日) 01:53:55.32ID:LqCUQ5jH
2022/10/09(日) 02:00:16.80ID:NMoxe/se
というかRustマジで良くできてんな
考え尽くされてるわ
考え尽くされてるわ
2022/10/09(日) 02:01:56.84ID:Z8ziuvVg
要するに変数は全部Cellで囲っておけばいいんでしょ
2022/10/09(日) 02:08:28.77ID:2Hsnp4rW
2022/10/09(日) 02:24:40.07ID:zCVUy+MP
Qt使おうかと考えているけど
バインディングライブラリのritualを勧めている人がいたけど
最後のコミットが去年でサポーターが心配なんだけど
結局Cのライブラリ読み込みや既存ライブラリの利用とかどれを使えばいいの?
バインディングライブラリのritualを勧めている人がいたけど
最後のコミットが去年でサポーターが心配なんだけど
結局Cのライブラリ読み込みや既存ライブラリの利用とかどれを使えばいいの?
2022/10/09(日) 03:05:30.55ID:LqCUQ5jH
>>91
それは基本的な理解ができていない
static変数はスレッド間で共有が可能なためその型はSync実装を必要とする
だからCellが使えないのは当たり前
スレッド間で共有する必要がないならば
スレッドローカルに持てばSync実装を必要としないためCellを使える
例えば
thread_local! {
static FOO: Cell<Vec<i32>> = Cell::new(Vec::new());
}
これでスレッド毎に持つことができる
もちろんスレッドを使わないシングルスレッドな状況でも使える
それは基本的な理解ができていない
static変数はスレッド間で共有が可能なためその型はSync実装を必要とする
だからCellが使えないのは当たり前
スレッド間で共有する必要がないならば
スレッドローカルに持てばSync実装を必要としないためCellを使える
例えば
thread_local! {
static FOO: Cell<Vec<i32>> = Cell::new(Vec::new());
}
これでスレッド毎に持つことができる
もちろんスレッドを使わないシングルスレッドな状況でも使える
2022/10/09(日) 04:37:34.70ID:8tdOWvz3
Cellって基本的に値がムーブされるから構造体分はmemcpyが起きると思うんだけどそこはどうなの
RefCellやMutexなら直接参照取れるからそっちの方が効率的だよね
RefCellやMutexなら直接参照取れるからそっちの方が効率的だよね
2022/10/09(日) 04:57:14.58ID:95mox/4o
複オジの嘘に騙される前には少しは頭使え
2022/10/09(日) 05:51:16.25ID:md7RXs4/
隔離スレに帰れ
2022/10/09(日) 05:51:33.43ID:LqCUQ5jH
>>94
memcpyは起きない
Cellに関係なく一般的にムーブはあくまでもRustの言語レベルにおける概念的なもの
したがって生成コードでは無駄なメモリ間のムーブ(コピー)は起きずに最適化される
Cellの場合でも同様に最適化される
&Cell<T>に対してtake()してTを更新してset()するコードは
& mut Tに対してTを更新するコードと同じ生成コードとなる
例えばそれらの比較コード
https://godbolt.org/z/1TY9v33YP
完全に同じ生成コードとなっていることが分かる
つまりCell<T>はTと比較して実行時ゼロコストである
memcpyは起きない
Cellに関係なく一般的にムーブはあくまでもRustの言語レベルにおける概念的なもの
したがって生成コードでは無駄なメモリ間のムーブ(コピー)は起きずに最適化される
Cellの場合でも同様に最適化される
&Cell<T>に対してtake()してTを更新してset()するコードは
& mut Tに対してTを更新するコードと同じ生成コードとなる
例えばそれらの比較コード
https://godbolt.org/z/1TY9v33YP
完全に同じ生成コードとなっていることが分かる
つまりCell<T>はTと比較して実行時ゼロコストである
98デフォルトの名無しさん
2022/10/09(日) 07:01:12.90ID:vVo7+K5Y RustコンパイラとLLVMは凄いなあ
いつでもそうだけど生成コードではがっちり最適化してくれる
抽象的に書いても安全に書いてもCと同じ速さ
いつでもそうだけど生成コードではがっちり最適化してくれる
抽象的に書いても安全に書いてもCと同じ速さ
2022/10/09(日) 11:45:38.50ID:kycCKtGO
おまえも隔離スレに帰れ!ちょっと前にLLVMだから凄い坊があそこで暴れてたけど、ここはgccrsとかやる人の場だ、市ね
100デフォルトの名無しさん
2022/10/09(日) 13:36:44.30ID:1+WY+ral gccrsって使えるようになったの?
101デフォルトの名無しさん
2022/10/09(日) 20:46:00.69ID:yOxuO3a2 Linux6.1ってRustで組んだってこと?
102デフォルトの名無しさん
2022/10/09(日) 22:32:00.35ID:pzhOBcZ9 ドライバ等をRustでも書けるようになるだけ
103デフォルトの名無しさん
2022/10/09(日) 23:29:48.75ID:FY4RBnfH Pattern alternativesってなんですか?和訳のパターンORもよくわかりません
https://doc.rust-lang.org/book/appendix-02-operators.html
https://doc.rust-jp.rs/book-ja/appendix-02-operators.html
https://doc.rust-lang.org/book/appendix-02-operators.html
https://doc.rust-jp.rs/book-ja/appendix-02-operators.html
104デフォルトの名無しさん
2022/10/09(日) 23:53:45.87ID:vVo7+K5Y パターンの代替策
つまり「|」記号が
bit演算のORとしてだけでなく
パターンのORとしても使われるよってこと
つまり「|」記号が
bit演算のORとしてだけでなく
パターンのORとしても使われるよってこと
105デフォルトの名無しさん
2022/10/10(月) 11:32:20.19ID:wEJNunBW106デフォルトの名無しさん
2022/10/10(月) 11:45:42.80ID:wEJNunBW107デフォルトの名無しさん
2022/10/10(月) 18:49:06.89ID:lNBbmc/N Linux Kernel6.1は、Rustへ移行した最初のバージョンとなります。
Rustへ移行することにより、C言語バージョンの世代から、およそ30%の高速化を果たしました。
Rustへ移行することにより、C言語バージョンの世代から、およそ30%の高速化を果たしました。
108デフォルトの名無しさん
2022/10/10(月) 22:52:16.26ID:3WEeN/aN 気分はCelltic!
「実はshared xor mutableってしっくりこないんです!」
「実はshared xor mutableってしっくりこないんです!」
109デフォルトの名無しさん
2022/10/10(月) 23:11:02.61ID:U+uG6kFy >>105
内部可変性を得たい場合
スレッド内ではCell<T>もしくは参照を持ち出したいならRefCell<T>を使う
スレッド内部で普通の共有ならばそれらの&を使う (&mutでなくてもOK)
スレッド内部で所有者が別となる共有ならばそれらのRc<...>を使う
スレッド間では完全排他のMutex<T>もしくはreaders複数可のRwLock<T>を使う
(ただしTがi32やboolならばもっと軽いAtomicI32やAtomicBoolが使える)
スレッド間で共有は所有者が別となるのでそれらのArc<...>を使う
内部可変性を得たい場合
スレッド内ではCell<T>もしくは参照を持ち出したいならRefCell<T>を使う
スレッド内部で普通の共有ならばそれらの&を使う (&mutでなくてもOK)
スレッド内部で所有者が別となる共有ならばそれらのRc<...>を使う
スレッド間では完全排他のMutex<T>もしくはreaders複数可のRwLock<T>を使う
(ただしTがi32やboolならばもっと軽いAtomicI32やAtomicBoolが使える)
スレッド間で共有は所有者が別となるのでそれらのArc<...>を使う
110デフォルトの名無しさん
2022/10/11(火) 18:04:30.49ID:BiNGLwWh >>97
最適化頑張ってるだけでムーブは概念的なものじゃないぞ。RBMMなんだから。
最適化頑張ってるだけでムーブは概念的なものじゃないぞ。RBMMなんだから。
111デフォルトの名無しさん
2022/10/11(火) 19:16:08.16ID:Bl5ahscm moveがmemcpy呼び出しになるかどうかはあくまでも実装の話で
move自体のセマンティクスはデータのコピーを要求しないということが言いたいのでは
最適化offにして構造体サイズ大きくするとmemcpy呼び出されるから、memcpy起きないというのは嘘だけど
move自体のセマンティクスはデータのコピーを要求しないということが言いたいのでは
最適化offにして構造体サイズ大きくするとmemcpy呼び出されるから、memcpy起きないというのは嘘だけど
112デフォルトの名無しさん
2022/10/11(火) 19:23:40.64ID:61VrJvDY >>110
あくまでもRustの言語レベルでの抽象的なレベルではムーブはムーブであってビットコピーの保証はそこには一切ない
そして我々は抽象的な概念に基づいてプログラミングすればよい
生成コードはムーブという抽象的な概念だけを保証して最適化される
だからこそ生成コードではムーブでビットコピーが消え得る
あくまでもRustの言語レベルでの抽象的なレベルではムーブはムーブであってビットコピーの保証はそこには一切ない
そして我々は抽象的な概念に基づいてプログラミングすればよい
生成コードはムーブという抽象的な概念だけを保証して最適化される
だからこそ生成コードではムーブでビットコピーが消え得る
113デフォルトの名無しさん
2022/10/11(火) 19:29:43.10ID:61VrJvDY >>111
memcpyはたまたまムーブの最適化なしのデフォルト状態で行われる可能性のあるコードにすぎないね
Rustの言語としてはmemcpyが必ず行われることなんて全く保証しない
ムーブはもっと上位の概念であってRustが保証するのはその上位の概念のみだね
memcpyはたまたまムーブの最適化なしのデフォルト状態で行われる可能性のあるコードにすぎないね
Rustの言語としてはmemcpyが必ず行われることなんて全く保証しない
ムーブはもっと上位の概念であってRustが保証するのはその上位の概念のみだね
114デフォルトの名無しさん
2022/10/11(火) 19:51:08.13ID:Bl5ahscm115デフォルトの名無しさん
2022/10/11(火) 20:23:10.29ID:iRs2n6UT >>114
実はRefCell構造体のメンバーにCellが使われている(現状)
使用されるメモリサイズ
Cell<T> ← Tと同じサイズ
RefCell<T> ← Tのサイズに加えてborrow管理のために内部で使用するCellサイズ分加算
動作コスト
Cell<T> ← (利用後すぐset()すれば)Tと同じコスト
RefCell<T> ← Tのコストに加えてborrow管理のために内部で使用するCellの読み書き操作コスト分加算
実はRefCell構造体のメンバーにCellが使われている(現状)
使用されるメモリサイズ
Cell<T> ← Tと同じサイズ
RefCell<T> ← Tのサイズに加えてborrow管理のために内部で使用するCellサイズ分加算
動作コスト
Cell<T> ← (利用後すぐset()すれば)Tと同じコスト
RefCell<T> ← Tのコストに加えてborrow管理のために内部で使用するCellの読み書き操作コスト分加算
116デフォルトの名無しさん
2022/10/11(火) 21:44:42.19ID:P/g9+OyI ホント笑っちゃうくらい嘘を散りばめてくるよねw
117デフォルトの名無しさん
2022/10/11(火) 21:58:52.19ID:lchMb24F >>114
RefCellやMutexの方が効率的かという質問については
代用として使うならばそれらの方が遅いでしょう
RefCellはボローチェック処理が必ず入ります
Mutexは排他的ロック処理が入るのでさらに遅いです
RefCellやMutexの方が効率的かという質問については
代用として使うならばそれらの方が遅いでしょう
RefCellはボローチェック処理が必ず入ります
Mutexは排他的ロック処理が入るのでさらに遅いです
118デフォルトの名無しさん
2022/10/11(火) 22:06:38.86ID:Bl5ahscm119デフォルトの名無しさん
2022/10/12(水) 14:10:22.75ID:IRDyECLz ムーブ元の変数が使われないことがわかってるんだから
その変数の領域を使い回せばよいだけでしょ?
普通に考えてコピーとか起きないと思うんだが
その変数の領域を使い回せばよいだけでしょ?
普通に考えてコピーとか起きないと思うんだが
120デフォルトの名無しさん
2022/10/12(水) 18:26:20.15ID:R7/twQcO 自称分かってる人同士のケンカ
121デフォルトの名無しさん
2022/10/12(水) 21:47:16.08ID:TdLmkMrU RefCell使うのはアロケーションを避けたいからでしょ
122デフォルトの名無しさん
2022/10/12(水) 23:29:45.96ID:MmGzrhE7 Cell<T>もTもメモリ領域は同じサイズで性質が異なるだけなのね
Cell<T>の更新はこうなるから
(1) メモリ→value読み出し // take()その1
(2) メモリ←default-value書き込み // take()その2
(3) valueを更新してnew-value
(4) メモリ←new-value書き込み // set()
コンパイラがまともなら(2)の部分はムダと判断して無くせそうね
さらにvalueの更新内容によっては (例えば足し算など算術の場合など)
その後にLLVMが最適化でメモリに対して直接実行する命令コードにするだろうから読み出し書き込みも消えるわけね
Cell<T>の更新はこうなるから
(1) メモリ→value読み出し // take()その1
(2) メモリ←default-value書き込み // take()その2
(3) valueを更新してnew-value
(4) メモリ←new-value書き込み // set()
コンパイラがまともなら(2)の部分はムダと判断して無くせそうね
さらにvalueの更新内容によっては (例えば足し算など算術の場合など)
その後にLLVMが最適化でメモリに対して直接実行する命令コードにするだろうから読み出し書き込みも消えるわけね
123デフォルトの名無しさん
2022/10/13(木) 01:04:10.25ID:v9vBAx/l CopyじゃないStringやVecで&mut selfとるメソッドを試せば違いが分かるよ
124デフォルトの名無しさん
2022/10/13(木) 02:00:58.56ID:m/K7Pbd2 Copyを実装しない適当な構造体
#[derive(Default)]
struct Foo {
inner: i32,
}
の &Cell<Foo> と &mut i32 の両方のケースで
>>122の最適化により同じ生成コードとなるから
Copyを実装してるか否かは関係ないみたい
#[derive(Default)]
struct Foo {
inner: i32,
}
の &Cell<Foo> と &mut i32 の両方のケースで
>>122の最適化により同じ生成コードとなるから
Copyを実装してるか否かは関係ないみたい
125デフォルトの名無しさん
2022/10/13(木) 03:36:21.71ID:Oo+uXzBV126デフォルトの名無しさん
2022/10/13(木) 04:02:18.88ID:cMF4wuqy アロケーション発生しなくても(i32, i32)とかにするだけでもう生成アセンブリ同じじゃなくなるね
127デフォルトの名無しさん
2022/10/13(木) 08:01:16.32ID:wSzwAK9q128デフォルトの名無しさん
2022/10/13(木) 15:12:31.34ID:FWxI+s/s >>126
Copyにしてget/setにすれば同じになるかも
Copyにしてget/setにすれば同じになるかも
129デフォルトの名無しさん
2022/10/13(木) 15:31:24.77ID:WZ96xtHr macOSにおけるFirefoxのパフォーマンスを劇的に改善した方法とは?
メモリアロケーター「jemalloc」を独自にカスタマイズしたアロケーターを用いてメモリ管理を行っています。Firefoxのアロケーターでは並列処理時のロックを効率的に行うためにOSごとにネイティブなAPIを使用しているとのこと。このロックAPIとして、macOSではOSSpinLockが用いられていました。
https://gigazine.net/news/20221011-firefox-macos/
これって、Rustのメモリアロケーターがjemallocを基にしたRust実装になってるってことだよね?大昔はjemallocだったという話で
メモリアロケーター「jemalloc」を独自にカスタマイズしたアロケーターを用いてメモリ管理を行っています。Firefoxのアロケーターでは並列処理時のロックを効率的に行うためにOSごとにネイティブなAPIを使用しているとのこと。このロックAPIとして、macOSではOSSpinLockが用いられていました。
https://gigazine.net/news/20221011-firefox-macos/
これって、Rustのメモリアロケーターがjemallocを基にしたRust実装になってるってことだよね?大昔はjemallocだったという話で
130はちみつ餃子 ◆8X2XSCHEME
2022/10/13(木) 16:10:29.83ID:PFF+OL8h >>129
現在の Rust はデフォルトではシステム標準のアロケータを使うはず。
一時期は Jemalloc (のバインディング) を使っていたけどだいぶん前にやめてる。
やりたければアロケータの差し替えは簡単に出来るので
大きなプロジェクトだと (必要な性質にあわせて) 専用のアロケータを持っていることはあるかも。
現在の Rust はデフォルトではシステム標準のアロケータを使うはず。
一時期は Jemalloc (のバインディング) を使っていたけどだいぶん前にやめてる。
やりたければアロケータの差し替えは簡単に出来るので
大きなプロジェクトだと (必要な性質にあわせて) 専用のアロケータを持っていることはあるかも。
131デフォルトの名無しさん
2022/10/13(木) 16:44:36.94ID:7pqOU2dm132デフォルトの名無しさん
2022/10/13(木) 17:51:45.20ID:Fb+ro4ZF >>129
Rustでは1.32.0(2019/01/17)から jemalloc がデフォルトでなくなりましたが、理由はjemallocのほうがマルチスレッドでは
微妙に低負荷で速いですが、コンパイルバイナリで300kB追加されるのとjemalloc自体のバグなどで問題が出ていたから。
Firefoxは恐らく、Cargo.tomlでアロケターをjemalloc系(多分tikv-jemallocator)に変えていて速度を稼いでるのでは?
(完全に想像だけど・・・)
Rust で jemalloc を使ったら並列処理が速くなった
https://zenn.dev/hankei6km/articles/using-jemalloc-in-rust-speeds-up-parallelism
Rustでは1.32.0(2019/01/17)から jemalloc がデフォルトでなくなりましたが、理由はjemallocのほうがマルチスレッドでは
微妙に低負荷で速いですが、コンパイルバイナリで300kB追加されるのとjemalloc自体のバグなどで問題が出ていたから。
Firefoxは恐らく、Cargo.tomlでアロケターをjemalloc系(多分tikv-jemallocator)に変えていて速度を稼いでるのでは?
(完全に想像だけど・・・)
Rust で jemalloc を使ったら並列処理が速くなった
https://zenn.dev/hankei6km/articles/using-jemalloc-in-rust-speeds-up-parallelism
133デフォルトの名無しさん
2022/10/13(木) 20:45:15.45ID:7pqOU2dm134デフォルトの名無しさん
2022/10/13(木) 23:11:21.07ID:Fb+ro4ZF >>133
元記事見ると、jemallocそのものを一部、リプレースして書き換えてるみたいね。firefoxのレタリングエンジン自体はservoで
tikv-jemallocatorを使ってるみたいだけど、リンクしてるのはその通りオリジナルではなく書き換えたjemallocになってるみたい
https://github.com/servo/servo/blob/master/components/allocator/Cargo.toml
https://searchfox.org/mozilla-central/source/memory/replace/logalloc/README
元記事見ると、jemallocそのものを一部、リプレースして書き換えてるみたいね。firefoxのレタリングエンジン自体はservoで
tikv-jemallocatorを使ってるみたいだけど、リンクしてるのはその通りオリジナルではなく書き換えたjemallocになってるみたい
https://github.com/servo/servo/blob/master/components/allocator/Cargo.toml
https://searchfox.org/mozilla-central/source/memory/replace/logalloc/README
135デフォルトの名無しさん
2022/10/13(木) 23:14:01.26ID:Fb+ro4ZF いや動的リンクはしてないのかな?jemallocソースをリプレースして実行ファイルに組み込んでる
136デフォルトの名無しさん
2022/10/13(木) 23:25:53.83ID:cMF4wuqy Firefoxはservo使ってない定期
137デフォルトの名無しさん
2022/10/14(金) 01:05:31.38ID:2gl6G2n+ >>127
コンパイラはそんなに賢くないってことじゃね?
コンパイラはそんなに賢くないってことじゃね?
138デフォルトの名無しさん
2022/10/14(金) 10:36:15.19ID:P+TQoSXr 複オジの嘘をまともに相手してたらキリが無いよ
139デフォルトの名無しさん
2022/10/14(金) 11:07:41.50ID:t+3JDnfr おじさんなんで最近こっちにいるの?
隔離スレが機能しなくなったのとリンクしてるのが面白い
隔離スレが機能しなくなったのとリンクしてるのが面白い
140デフォルトの名無しさん
2022/10/14(金) 21:09:01.17ID:iCatm8xv141デフォルトの名無しさん
2022/10/15(土) 00:38:51.20ID:ZRY2KlKK >>140
servoを構成するコンポーネントのうちfirefoxに取り込まれたstyloしか登場してないように見えるが
servoを構成するコンポーネントのうちfirefoxに取り込まれたstyloしか登場してないように見えるが
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★3 [BFU★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★4 [Hitzeschleier★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- ホリエモン、「持ち家=幸せという価値観は過去のもの」と断言「快適な住まいが欲しいなら、賃貸住宅を次々に替えていく」 [muffin★]
- 【実況】博衣こよりのえちえちスーパーダンガンロンパ3🧪
- 人生に飽きた
- 【画像】自分がオッサンか若者か、5秒で判断できる画像がこれらしい [977261419]
- 【新番組】轟はじめ🐧⚡のぶんぶんぶーん🚗💨!【🏡】
- 自民党のヒゲ「日本側の無線でcopyとは言ったが了解という意味ではない」 [834922174]
- お
