公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※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 part24
https://mevius.5ch.net/test/read.cgi/tech/1716759686/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part25
■ このスレッドは過去ログ倉庫に格納されています
2024/07/31(水) 00:46:26.17ID:DBMWY2QT
2024/08/04(日) 16:16:53.81ID:HF9mGFi1
2倍にしていけば累積コピー回数を平均1回台に抑えられるメリットがあって
これは1+2+4+8+...+2^(n-2)+2^(n-1)=2^n-1で累積と同じになるからで
そのためC++(gccやclang)やRustは2倍を採用している状況
別問題として
2倍にしていくのはメモリがもったいなくね?があるけど
OSの仮想メモリ管理により実際に使われるまでは実メモリが使われることはないのでだいじょうぶ
さらに自らv.reserve(size)とサイズを指定する手段も用意されていて
size以下の間はお引っ越しコピーを避けることができるので見積もれる時は推奨だよ
これは1+2+4+8+...+2^(n-2)+2^(n-1)=2^n-1で累積と同じになるからで
そのためC++(gccやclang)やRustは2倍を採用している状況
別問題として
2倍にしていくのはメモリがもったいなくね?があるけど
OSの仮想メモリ管理により実際に使われるまでは実メモリが使われることはないのでだいじょうぶ
さらに自らv.reserve(size)とサイズを指定する手段も用意されていて
size以下の間はお引っ越しコピーを避けることができるので見積もれる時は推奨だよ
18デフォルトの名無しさん
2024/08/04(日) 17:23:30.18ID:ku/HSe0h reallocationなんてパフォーマンス落ちるだけだし
with_capacityで自分でコントロールした方が良いと思う
with_capacityで自分でコントロールした方が良いと思う
19デフォルトの名無しさん
2024/08/04(日) 17:51:55.81ID:tbuKemgK2024/08/04(日) 18:11:52.52ID:mDDM97lI
大きなサイズに育っていくならコピー回数が少なくなる毎回2倍が有利
仮想メモリが足りるか足りないかの限界状況で用いるならwith_capacity()やreserve()を最初から用いる
仮想メモリが足りるか足りないかの限界状況で用いるならwith_capacity()やreserve()を最初から用いる
2024/08/04(日) 18:28:12.58ID:mhkxn3lF
フラグメンテーションの問題とかもあるから教科書通りの2倍固定よりも
Goのようにサイズが大きくなるにつれGrowth Factorも小さくしていくモデルのほうが一般的には良さそうだね
Goのようにサイズが大きくなるにつれGrowth Factorも小さくしていくモデルのほうが一般的には良さそうだね
2024/08/04(日) 18:43:06.42ID:YKxthOUq
gccでもclangでもC++のvectorは2倍にしていくから
これはRustの話ではなくて
2倍にしていくのが好ましいという長年の確立された知見が存在しているんだよ
これはRustの話ではなくて
2倍にしていくのが好ましいという長年の確立された知見が存在しているんだよ
2024/08/04(日) 18:44:03.04ID:YKxthOUq
一方でガベージコレクション依存言語は内部のメモリ管理方式が全く異なるから
各言語個別の事情があるかもしれないけどこのスレの話題ではないね
各言語個別の事情があるかもしれないけどこのスレの話題ではないね
2024/08/04(日) 19:01:06.46ID:S53R2Qhs
>>16
それらの言語は仮想メモリを持たない環境のことも考慮しての増加率なんだろうな
それらの言語は仮想メモリを持たない環境のことも考慮しての増加率なんだろうな
2024/08/04(日) 19:12:09.84ID:gh5gXoAa
仮想メモリを持たない環境でGC言語www
2024/08/04(日) 19:40:14.37ID:EnndQ4ap
思い込みの激しい人だこと
27デフォルトの名無しさん
2024/08/04(日) 19:41:13.70ID:ao1w9dwD Vecのアロケート戦略なんて標準ライブラリの実装レベルの話でしかないし、言語の特徴や優劣のような話でもないだろ
GoやJavaが2倍でも、逆にRustがより小さい値だったとしても、GCの有無とかの話に比べればずっと些細な話でしかないし
マジでなにいってるんだこいつとしか思えない
GoやJavaが2倍でも、逆にRustがより小さい値だったとしても、GCの有無とかの話に比べればずっと些細な話でしかないし
マジでなにいってるんだこいつとしか思えない
2024/08/04(日) 19:48:10.28ID:S53R2Qhs
2024/08/04(日) 20:16:30.17ID:5nFDNjd2
この議論
元々メモリ無駄食いのGC依存言語は無視してよくて、
Rustと同じジャンルのC++で長年議論されてきて2倍という結論が出ている。
どうしても2倍を批判したいならまずはgccやclangのC++に対して行なうとよいかと。
元々メモリ無駄食いのGC依存言語は無視してよくて、
Rustと同じジャンルのC++で長年議論されてきて2倍という結論が出ている。
どうしても2倍を批判したいならまずはgccやclangのC++に対して行なうとよいかと。
30デフォルトの名無しさん
2024/08/04(日) 20:31:51.43ID:ao1w9dwD 2倍に対して突っ込んでるんじゃなくて延々と的外れなことを書いてることに対して突っ込まれてるだけでは?
平均的なコピー回数が少ない点で2倍は妥当ではあるけど、それも「よく使われる方法」くらいの意味しかない
C++でもMSVCだと1.5倍だったと思うし (今のバージョンでもそうかは未確認)
平均的なコピー回数が少ない点で2倍は妥当ではあるけど、それも「よく使われる方法」くらいの意味しかない
C++でもMSVCだと1.5倍だったと思うし (今のバージョンでもそうかは未確認)
2024/08/04(日) 22:06:56.31ID:H9q8xh4E
>>21
Goがなぜそんなやり方をしているのか
実行しながら実メモリ使用量の変化を傍らでウォッチして見た
Goの大きなsliceでcapacityが増える時に実メモリ使用量が急激に増える
C++やRustではcapacityが増えてもそんな変動は起きない
つまりGoはこの問題のため2倍ではなく1.25倍にせざるをえないと思われる
Goがなぜそんなやり方をしているのか
実行しながら実メモリ使用量の変化を傍らでウォッチして見た
Goの大きなsliceでcapacityが増える時に実メモリ使用量が急激に増える
C++やRustではcapacityが増えてもそんな変動は起きない
つまりGoはこの問題のため2倍ではなく1.25倍にせざるをえないと思われる
2024/08/05(月) 00:28:29.24ID:vHNgTuSQ
>>16の主張が間違っていた可能性があるな
例えば世代別GC各管理領域も拡張再編などが起きるため
C++/Rustとは状況が異なり
増やしたメモリ領域への書き込みがすぐに生じて実メモリ使用量が一気に増えてしまうのかもしれない
例えば世代別GC各管理領域も拡張再編などが起きるため
C++/Rustとは状況が異なり
増やしたメモリ領域への書き込みがすぐに生じて実メモリ使用量が一気に増えてしまうのかもしれない
2024/08/05(月) 02:39:57.82ID:zvBpOjwN
C++で folly::fbvector を開発したFacebookによれば
成長係数2は最悪であることが数学的に証明されてるらしい
結論は1.5
https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
成長係数2は最悪であることが数学的に証明されてるらしい
結論は1.5
https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
2024/08/05(月) 05:37:35.60ID:7ld9tmOF
>>34
読んでみたが色々とおかしい
まず1.5倍がベストな理由が書かれていない
次に2倍が悪い理由の説明と現実が合っていない
書かれている2倍が悪い理由を具体的な数字で書いてみると
例えばベクタの使用メモリサイズが育っていって1GBになっている時に
過去に使った半分の512MBの空きが抜け殻としてあり
さらにその前の分として半分の256MBの空きもありそれが過去に繰り返されていて
512MB + 256MB + 128MB + 64MB + ...
= 1GB未満のの再利用できていないメモリがあることになる
つまり再利用ができていないために合わせて約2GBのメモリを確保しているにも関わらず使っているのは半分の1GBなってしまう
という2倍が悪い理由が書かれている
しかしこれは現実と異なる
実際にベクタをゼロから地道にプッシュしていきそのサイズが1GBになった時
確保しているメモリサイズを調べると1GBである
再利用できていない昔の抜け殻が計1GB弱残るという話が現実と合っていない
読んでみたが色々とおかしい
まず1.5倍がベストな理由が書かれていない
次に2倍が悪い理由の説明と現実が合っていない
書かれている2倍が悪い理由を具体的な数字で書いてみると
例えばベクタの使用メモリサイズが育っていって1GBになっている時に
過去に使った半分の512MBの空きが抜け殻としてあり
さらにその前の分として半分の256MBの空きもありそれが過去に繰り返されていて
512MB + 256MB + 128MB + 64MB + ...
= 1GB未満のの再利用できていないメモリがあることになる
つまり再利用ができていないために合わせて約2GBのメモリを確保しているにも関わらず使っているのは半分の1GBなってしまう
という2倍が悪い理由が書かれている
しかしこれは現実と異なる
実際にベクタをゼロから地道にプッシュしていきそのサイズが1GBになった時
確保しているメモリサイズを調べると1GBである
再利用できていない昔の抜け殻が計1GB弱残るという話が現実と合っていない
2024/08/05(月) 07:22:04.78ID:Fnw9TU7n
mmap/munmapでOSにメモリを返却できるから古い抜け殻は残らない
さらにmremapで実コピーをせずに利用可能サイズを増やすことができる
それらを呼び出すコストがかかるためその頻度が1.x倍より少なくなる2倍が好ましい
さらにmremapで実コピーをせずに利用可能サイズを増やすことができる
それらを呼び出すコストがかかるためその頻度が1.x倍より少なくなる2倍が好ましい
37デフォルトの名無しさん
2024/08/05(月) 12:04:08.00ID:3XGRFYoN 話が難しいから何を言っているかじゃなくて誰が言ってるかでしか判断出来ねえ
そして5chをソースにfollyのreadmeを否定する意見を信じることも出来ねえ
そして5chをソースにfollyのreadmeを否定する意見を信じることも出来ねえ
2024/08/05(月) 12:25:55.60ID:GBSMEVUI
話は聞かせてもらった
最適な比率は2でも1.5でもなく黄金比1.618だな
こういう問題は大体フィボナッチ数列が正解になる
僕は数学に詳しいんだ
最適な比率は2でも1.5でもなく黄金比1.618だな
こういう問題は大体フィボナッチ数列が正解になる
僕は数学に詳しいんだ
2024/08/05(月) 12:37:42.98ID:KD4qg6Wm
2024/08/05(月) 12:46:25.51ID:oUc4bjr3
>>37
むしろ彼しか問題にしてないだろ
g++とclang++のvectorとrustcのVecは2倍にしていく
もし2倍が致命的なら大論争になり変更されるはずだ
現実には実用面も含めて問題となっていない
むしろ彼しか問題にしてないだろ
g++とclang++のvectorとrustcのVecは2倍にしていく
もし2倍が致命的なら大論争になり変更されるはずだ
現実には実用面も含めて問題となっていない
2024/08/05(月) 13:06:57.87ID:8Bk1A49H
「致命的」に後退しちゃったねw
2024/08/05(月) 13:12:56.68ID:cmuXon6W
Linux などのメモリ管理戦略ではアロケータは空いてる番地を返すだけで
アクセスするまで実メモリの割り当てをしない。 (割り当てを遅延させる。)
vector を極端に伸ばしたり縮めたりするなら話は別だが、
徐々に伸びていって最後に捨てる一般的なユースケースなら
倍率はテキトーでも理論的な効率はそんなに差はない。
アクセスするまで実メモリの割り当てをしない。 (割り当てを遅延させる。)
vector を極端に伸ばしたり縮めたりするなら話は別だが、
徐々に伸びていって最後に捨てる一般的なユースケースなら
倍率はテキトーでも理論的な効率はそんなに差はない。
2024/08/05(月) 13:21:17.66ID:0eF3nMAk
rustやc++では再割り当てが行われると参照が無効になるから2倍にして頻度を下げるのかも
2024/08/05(月) 14:50:20.61ID:Ha+1Ci4D
https://github.com/rust-lang/rust/issues/29931
これだね
2015年から議論されてるけど、結局1.5倍がいいという結論には至ってないし
実際1.5倍を試してみた結果パフォーマンスが落ちてるから単純に1.5倍にするのはダメそう
もし1.X倍でパフォーマンス上がる方法があるならそのissueに報告すれば採用されるかもよ
これだね
2015年から議論されてるけど、結局1.5倍がいいという結論には至ってないし
実際1.5倍を試してみた結果パフォーマンスが落ちてるから単純に1.5倍にするのはダメそう
もし1.X倍でパフォーマンス上がる方法があるならそのissueに報告すれば採用されるかもよ
2024/08/05(月) 15:01:05.36ID:zvBpOjwN
>>44
rustcがベンチマークのネタに適してないんじゃないの?
rustcがベンチマークのネタに適してないんじゃないの?
2024/08/05(月) 15:14:32.99ID:Ha+1Ci4D
2024/08/05(月) 15:48:02.67ID:dNRQyEIb
もっと歴史の長いGCCのC++もClangのC++もvectorの再割り当ての長さ2倍を採用している
そしてGCを用いてメモリ管理する言語は各々で諸事情があるようだから参考にできない
そしてGCを用いてメモリ管理する言語は各々で諸事情があるようだから参考にできない
2024/08/05(月) 16:04:04.60ID:trHMLJ8c
fbvectorの話はアロケータが確保する単位に合わせて無駄を無くすということと
Vecのリサイズによって開放されたメモリ領域を再利用しやすくするということが書いてるだけ
どっちも理にかなってる
Vecのリサイズによって開放されたメモリ領域を再利用しやすくするということが書いてるだけ
どっちも理にかなってる
2024/08/05(月) 16:26:39.60ID:cmuXon6W
標準として提供する機能には平均的な性能が高いよりも
最悪の場合でもそれなりの性能が出るほうを優先するみたいな考え方もあるし
設計思想にもよるわな。
最悪の場合でもそれなりの性能が出るほうを優先するみたいな考え方もあるし
設計思想にもよるわな。
2024/08/05(月) 18:42:38.74ID:4UY8EQs1
https://medium.com/smucs/fbvector-a-possible-replacement-for-std-vector-e46bb31b8a56
C++の結果だけど結構な差が出てる
この人のコードを自分の環境でも試してみたがpush_backで5倍前後違う
単純に1.5倍固定じゃなくて真似したやつで試してみたらいいのにね
C++の結果だけど結構な差が出てる
この人のコードを自分の環境でも試してみたがpush_backで5倍前後違う
単純に1.5倍固定じゃなくて真似したやつで試してみたらいいのにね
2024/08/05(月) 19:15:50.62ID:YtHc3yqJ
>>50
ソース見てみたけど恣意的に10倍ずつ異なる長さで順にアロケーションを汚染していき
vectorは単発使い捨てで毎回残らないからその前の残骸の空きエリアにたまたま上手くマッチするかの勝負になっていて
現実とはかけ離れたテストになっていると思った
ソース見てみたけど恣意的に10倍ずつ異なる長さで順にアロケーションを汚染していき
vectorは単発使い捨てで毎回残らないからその前の残骸の空きエリアにたまたま上手くマッチするかの勝負になっていて
現実とはかけ離れたテストになっていると思った
52デフォルトの名無しさん
2024/08/05(月) 23:13:48.63ID:SkPCtOW0 >>49
速度vsメモリ効率なんかもあるしね
速度vsメモリ効率なんかもあるしね
2024/08/05(月) 23:56:18.02ID:pmuFbIFu
>>50
こんなに違いが出るのか
こんなに違いが出るのか
2024/08/06(火) 00:27:44.41ID:XznSKINw
2024/08/06(火) 10:36:53.30ID:SBxTyrdX
2.71828倍が良いとおもいますん
56デフォルトの名無しさん
2024/08/06(火) 13:40:39.24ID:BFQfD5mu 1.14514倍で
2024/08/06(火) 17:53:14.98ID:XznSKINw
C++が1.5倍伸長のFBVectorで自分の抜け殻を上手く再利用する件
Rustはなぜ2倍伸長でもっと速いのかを調べてみた
同じように他に邪魔されず伸長していくケースだと
RustのVecは以下のように
128Kバイトまでは同じアドレスのまま移動せずにコピー無しで2倍伸長していく
256Kバイト以上ではmremap利用でアドレスは移動するがコピー無しで2倍伸長していく
そのためRustのVecは2倍伸長でもサイズが巨大になっても速いことがわかった
addr=0x5642549e6ab0 cap=8 len=1+1
addr=0x5642549e6ab0 cap=8 len=2+1
addr=0x5642549e6ab0 cap=8 len=4+1
addr=0x5642549e6ab0 cap=16 len=8+1
addr=0x5642549e6ab0 cap=32 len=16+1
(途中略) 【アドレスはずっと変わらない】
addr=0x5642549e6ab0 cap=32K len=16K+1
addr=0x5642549e6ab0 cap=64K len=32K+1
addr=0x5642549e6ab0 cap=128K len=64K+1
【ここでアドレスが変化&mremap利用が始まる】
addr=0x7f661c06f010 cap=256K len=128K+1
addr=0x7f661bfee010 cap=512K len=256K+1
addr=0x7f661beed010 cap=1M len=512K+1
addr=0x7f661bcec010 cap=2M len=1M+1
(以降略)
Rustはなぜ2倍伸長でもっと速いのかを調べてみた
同じように他に邪魔されず伸長していくケースだと
RustのVecは以下のように
128Kバイトまでは同じアドレスのまま移動せずにコピー無しで2倍伸長していく
256Kバイト以上ではmremap利用でアドレスは移動するがコピー無しで2倍伸長していく
そのためRustのVecは2倍伸長でもサイズが巨大になっても速いことがわかった
addr=0x5642549e6ab0 cap=8 len=1+1
addr=0x5642549e6ab0 cap=8 len=2+1
addr=0x5642549e6ab0 cap=8 len=4+1
addr=0x5642549e6ab0 cap=16 len=8+1
addr=0x5642549e6ab0 cap=32 len=16+1
(途中略) 【アドレスはずっと変わらない】
addr=0x5642549e6ab0 cap=32K len=16K+1
addr=0x5642549e6ab0 cap=64K len=32K+1
addr=0x5642549e6ab0 cap=128K len=64K+1
【ここでアドレスが変化&mremap利用が始まる】
addr=0x7f661c06f010 cap=256K len=128K+1
addr=0x7f661bfee010 cap=512K len=256K+1
addr=0x7f661beed010 cap=1M len=512K+1
addr=0x7f661bcec010 cap=2M len=1M+1
(以降略)
2024/08/06(火) 18:25:14.08ID:XznSKINw
もちろんVecは2倍伸長をアロケータにリクエストするだけなので
実際に処理しているのはRust標準のGlobalアロケータ
この環境では出来たバイナリにglibcのmallocやreallocがリンクされてるので最終的にはそこに行き着くはず
実際に処理しているのはRust標準のGlobalアロケータ
この環境では出来たバイナリにglibcのmallocやreallocがリンクされてるので最終的にはそこに行き着くはず
2024/08/06(火) 19:53:13.46ID:qnIYIy1G
Carbon Languageに期待
2024/08/06(火) 20:16:16.47ID:XznSKINw
Rustの標準アロケータを使わずに
>>57をjemalloc利用でアドレス変化を調べると全く異なる結果となった
8Kバイトまではアドレスが毎回変わりコピー移動
16Kバイトから1Mバイトまではアドレスが変わらずコピー無し
2Mバイト以上はアドレスが毎回変わりmremapが使われてないためコピー移動
少なくとも今回の前提での利用の範囲内ならば
Rust標準をそのまま用いるのが最適となる
>>57をjemalloc利用でアドレス変化を調べると全く異なる結果となった
8Kバイトまではアドレスが毎回変わりコピー移動
16Kバイトから1Mバイトまではアドレスが変わらずコピー無し
2Mバイト以上はアドレスが毎回変わりmremapが使われてないためコピー移動
少なくとも今回の前提での利用の範囲内ならば
Rust標準をそのまま用いるのが最適となる
2024/08/06(火) 20:54:39.49ID:wYh3ia3o
そういや一昔前、jemallocを採用してるから
Rustは良いんだよ、って主張があったよね
Rustは良いんだよ、って主張があったよね
2024/08/06(火) 21:01:13.77ID:6BvweKuM
jemallocは色々と問題もあるため5年半前の2019年1月のRust1.32で標準採用しなくなった
もちろんjemallocが好ましいケースもあるのでその時は各自で簡単に使えるようにもなってる
もちろんjemallocが好ましいケースもあるのでその時は各自で簡単に使えるようにもなってる
2024/08/07(水) 00:45:04.42ID:9wVUhjvG
未だに Vec::new_in() が安定化しないRustとは対照的に
Zigはヒープ使う関数すべてで毎回毎回アロケータを引数に渡させて
毎回毎回成功したか確認させるんだね
Linuxカーネル開発にはZigの方が向いてるんじゃなかろうか?
Zigはヒープ使う関数すべてで毎回毎回アロケータを引数に渡させて
毎回毎回成功したか確認させるんだね
Linuxカーネル開発にはZigの方が向いてるんじゃなかろうか?
2024/08/07(水) 01:13:06.44ID:laZXlxij
{C++ std::vector, C++ fbvector, Rust std::Vec} × {jemalloc, glibc malloc, LLVM libc malloc, msvc malloc, musl libc malloc} × {Linux, macOS, Windows} × {x86_64, 仮想メモリの機能を持たない何らかのアーキテクチャ}
壮大な議論になってきたなあ
これ全部検証するつもり?
そういやglibc mallocは環境変数でヒープとmmapのどっちを使うかの閾値調整できるとか
msvc mallocは_DEBUGマクロが定義されていると確保したメモリに未初期化を表すバイトを書き込むとかもあった
条件はいくらでも付け加えられそうやね
壮大な議論になってきたなあ
これ全部検証するつもり?
そういやglibc mallocは環境変数でヒープとmmapのどっちを使うかの閾値調整できるとか
msvc mallocは_DEBUGマクロが定義されていると確保したメモリに未初期化を表すバイトを書き込むとかもあった
条件はいくらでも付け加えられそうやね
2024/08/07(水) 01:28:00.75ID:bHbc7bDV
サイズの大きなベクタは
キャパシティ拡張してもコピーが発生しないmremap利用のアロケータが有利という結論だな
サーバなどで一般的に使われるLinux環境ならRust標準でその条件を満たすから大丈夫
キャパシティ拡張してもコピーが発生しないmremap利用のアロケータが有利という結論だな
サーバなどで一般的に使われるLinux環境ならRust標準でその条件を満たすから大丈夫
2024/08/07(水) 08:32:07.19ID:PoJHP1fy
2024/08/07(水) 22:36:11.64ID:U8gMstyu
https://www.publickey1.jp/blog/24/rustservowebverso.html
2024年8月6日
欧州を基盤にオープンでセキュアなインターネットの実現を支援しているNLnet Foundationは、
昨年(2023年)末から、Linux Foundation傘下でRust製のクロスプラットフォーム対応Webブラウザエンジンとして開発が進められている「Servo」を用いたWebブラウザ「Verso」の開発プロジェクトの立ち上げを発表した。
また、この「Servo」をTauriの組み込みのWebViewとする方向で開発が始まっている。
Chromiumに代わるRust製
2024年8月6日
欧州を基盤にオープンでセキュアなインターネットの実現を支援しているNLnet Foundationは、
昨年(2023年)末から、Linux Foundation傘下でRust製のクロスプラットフォーム対応Webブラウザエンジンとして開発が進められている「Servo」を用いたWebブラウザ「Verso」の開発プロジェクトの立ち上げを発表した。
また、この「Servo」をTauriの組み込みのWebViewとする方向で開発が始まっている。
Chromiumに代わるRust製
2024/08/07(水) 22:38:49.83ID:s3SzVI85
>>67
名前がダサすぎるからダメ
名前がダサすぎるからダメ
2024/08/08(木) 05:28:31.41ID:KaOTCOs+
ChromiumがC++のメモリ管理ミスで度々セキュリティ脆弱性を招いてるから
対抗馬ができるのは良いこと
対抗馬ができるのは良いこと
2024/08/08(木) 06:03:12.33ID:8alSA2PJ
まともに動くまで20年ぐらい掛かるんだろ
2024/08/08(木) 13:55:28.27ID:xUywgMY3
Firefox先生の明日はどっちだ
2024/08/09(金) 06:14:59.59ID:ho+3w6rX
Tauri2.0 Android/iOSでマルチwebviewしたかった
この流れだとVersoになるまで出来なさそう
この流れだとVersoになるまで出来なさそう
2024/08/09(金) 10:26:33.54ID:6vJua0o/
タウリン実際どうなん?
実用になる?
実用になる?
2024/08/09(金) 10:41:11.99ID:yHKv01cw
>>73
有用だけど場合による。
有用だけど場合による。
75デフォルトの名無しさん
2024/08/09(金) 17:08:58.86ID:k9SqobKt implementation of `From` is not general enough
= note: `From<&'0 Hoge>` would have to be implemented for the type `Fuga<'_>`,
for any lifetime `'0`...
= note: ...but `From<&'1 Hoge>` is actually implemented for the type `Fuga<'1>`,
for some specific lifetime `'1`
これはどうやって解決するのが普通?
= note: `From<&'0 Hoge>` would have to be implemented for the type `Fuga<'_>`,
for any lifetime `'0`...
= note: ...but `From<&'1 Hoge>` is actually implemented for the type `Fuga<'1>`,
for some specific lifetime `'1`
これはどうやって解決するのが普通?
76デフォルトの名無しさん
2024/08/09(金) 17:13:42.47ID:k9SqobKt こういう実装は書いてあります
impl<'a> From<&'a Hoge> for Fuga<'a> {
fn from(src: &'a Hoge) -> Fuga<'_> {
Fuga::from(なんかの変換(src))
}
}
impl<'a> From<&'a Hoge> for Fuga<'a> {
fn from(src: &'a Hoge) -> Fuga<'_> {
Fuga::from(なんかの変換(src))
}
}
77デフォルトの名無しさん
2024/08/09(金) 17:18:10.35ID:k9SqobKt fn moge<T>(a: &str, b: &str) -> i64 where T: for<'a> From<&'a Hoge> {
中身
let m = T::from(hoge);
中身
}
みたいな関数を呼んだ(コンパイル時)ときに >>75 のエラーで止まります
中身
let m = T::from(hoge);
中身
}
みたいな関数を呼んだ(コンパイル時)ときに >>75 のエラーで止まります
78デフォルトの名無しさん
2024/08/09(金) 17:22:16.81ID:k9SqobKt 呼ぶ方は
let x = moge::<Fuga>(2, 5);
みたいに呼びたいのです
let x = moge::<Fuga>(2, 5);
みたいに呼びたいのです
79デフォルトの名無しさん
2024/08/09(金) 17:22:41.31ID:k9SqobKt fn mame(a: &str, b: &str) -> i64 {
中身
let m = Fuga::from(hoge);
中身
}
としたときは正常にコンパイルも動作もできました
中身
let m = Fuga::from(hoge);
中身
}
としたときは正常にコンパイルも動作もできました
2024/08/09(金) 18:10:20.58ID:KcU/iUYV
81デフォルトの名無しさん
2024/08/09(金) 19:57:46.44ID:JtHudt0o `src` does not live long enough
--- argument requires that `src` is borrowed for `'a`
borrowed value does not live long enough
`src` dropped here while still borrowed
--- argument requires that `src` is borrowed for `'a`
borrowed value does not live long enough
`src` dropped here while still borrowed
2024/08/09(金) 21:05:31.98ID:tUCUurcu
playgroundに再現する最小限のコードを貼れよ
2024/08/09(金) 21:17:17.11ID:6vJua0o/
タウリンで作られたなんか実用的なアプリある?
2024/08/09(金) 23:57:36.49ID:3boFjk2T
2024/08/10(土) 00:51:32.88ID:uWTGSvHq
>>84
なんか中国人が多いな
なんか中国人が多いな
2024/08/10(土) 09:52:32.95ID:3hKdT569
先月の航空業界や病院に政府機関など850万台のWindows端末が影響を受けた世界的な大規模システム障害について、
CrowdStrikeが根本原因分析のレポートを発表しました。
「コンテンツインタープリターは20個の値しか想定していませんでした。
したがって、21番目の値にコンテンツインタープリターがアクセスしようとすると、入力データ配列の末尾を超えて領域外のメモリが読み取られ、
その結果システムがクラッシュしました」と報告しています。
記事
https://gigazine.net/news/20240809-crowdstrike-root-cause-analysis/
CrowdStrikeが根本原因分析のレポートを発表しました。
「コンテンツインタープリターは20個の値しか想定していませんでした。
したがって、21番目の値にコンテンツインタープリターがアクセスしようとすると、入力データ配列の末尾を超えて領域外のメモリが読み取られ、
その結果システムがクラッシュしました」と報告しています。
記事
https://gigazine.net/news/20240809-crowdstrike-root-cause-analysis/
2024/08/10(土) 10:02:51.23ID:KZxV9Wds
>>86
Windowsやマイクロソフトは何も悪くなかったのか
Windowsやマイクロソフトは何も悪くなかったのか
2024/08/10(土) 11:11:45.08ID:ymCXtc/f
2024/08/10(土) 12:59:11.84ID:hldat476
Rustを使っていればってのは机上の空論なんだよな
自分でできないことを人に求めるなよと
自分でできないことを人に求めるなよと
2024/08/10(土) 13:41:40.63ID:KZxV9Wds
っぱRustだな
91デフォルトの名無しさん
2024/08/10(土) 13:42:02.22ID:hJCMdysf 今までそのプロジェクトに一度も貢献したことの無い人が「Rustで書き直さないの?」ってIssueを立てて即リジェクトされるのを見かける……
なぜかそういう人が好む言語 (彼らが本当にRustを書いているのかは不明)
なぜかそういう人が好む言語 (彼らが本当にRustを書いているのかは不明)
2024/08/10(土) 13:42:44.88ID:KZxV9Wds
人間がチェックするよりコンパイラに機械的にチェックさせたほうがこういうミスは出ないってことだ
93デフォルトの名無しさん
2024/08/10(土) 13:45:07.25ID:fX5Mv2O+ >>92
今回のクラウドストライクのやらかしは本来はテストコードで見つかるはずの脆弱性なんだけどな
今回のクラウドストライクのやらかしは本来はテストコードで見つかるはずの脆弱性なんだけどな
2024/08/10(土) 13:56:12.38ID:WA5EFoZj
Rustで防げる種類バグがあるのは事実でも、Rustに変えるとバグが減ります! と言っちゃうと嘘になる現実があるからみんな苦しんでるんですよ
2024/08/10(土) 14:13:42.84ID:yKio8xQl
2024/08/10(土) 15:13:38.79ID:qd6SEEuZ
それなのにRustは全然使われない理由って何なのかなあ
97デフォルトの名無しさん
2024/08/10(土) 15:33:50.34ID:NMxi230z クラウドストライクが件のセキュリティソフトを開発し始めた頃はまだRustが安定版になかったし仕方ない
98デフォルトの名無しさん
2024/08/10(土) 15:37:06.14ID:hJCMdysf 言語とビジネスは別の話だからだろ
顧客はソフトウェア製品にお金を出すのであって、「Rustで書かれていること」にお金を払うわけじゃない
既存プロジェクトを置き換えたところで顧客から追加のお金を貰えるわけではないし、置き換えをメインに作業してる間は機能追加などの開発は止まるわけだし
新規開発での採用は進んでると思うぞ
顧客はソフトウェア製品にお金を出すのであって、「Rustで書かれていること」にお金を払うわけじゃない
既存プロジェクトを置き換えたところで顧客から追加のお金を貰えるわけではないし、置き換えをメインに作業してる間は機能追加などの開発は止まるわけだし
新規開発での採用は進んでると思うぞ
2024/08/10(土) 16:01:23.31ID:7leusf5/
以前からのは対策が遅れるの仕方ないよな
ただし新規案件でC++はアウトで言い訳できない
十分に学習とお試しする時間があったのだから
ただし新規案件でC++はアウトで言い訳できない
十分に学習とお試しする時間があったのだから
100デフォルトの名無しさん
2024/08/10(土) 16:03:24.43ID:AQDKnTti もともとC++を使う案件自体が少ないんで
シビアなところは互換性を考慮してC++のまんまだし
シビアなところは互換性を考慮してC++のまんまだし
101デフォルトの名無しさん
2024/08/10(土) 16:16:28.94ID:hldat476 >>99
お前は何様なんだよw
お前は何様なんだよw
103デフォルトの名無しさん
2024/08/10(土) 16:58:24.77ID:dQTVCz1X104デフォルトの名無しさん
2024/08/10(土) 17:14:57.10ID:WA5EFoZj 多分>>76の戻り値をFuga<'a>に直すのが根本的解決だけどうまくいったならもういっか
105デフォルトの名無しさん
2024/08/10(土) 22:48:05.26ID:ogPlSB6Z タウリン好き
WinMacで動くクライアントアプリ書きたかってん
WinMacで動くクライアントアプリ書きたかってん
106デフォルトの名無しさん
2024/08/10(土) 23:49:33.16ID:oQf4NdPP >>104
私の記憶ではそこはやってみたのですが治りませんでしたね
私の記憶ではそこはやってみたのですが治りませんでしたね
107デフォルトの名無しさん
2024/08/11(日) 08:59:52.85ID:aVi0ITMX108デフォルトの名無しさん
2024/08/11(日) 11:53:58.67ID:iWzuk0+l Rustで防げるっていうのは、リストに正常にアクセスできたかチェックを強制されるって意味?
109デフォルトの名無しさん
2024/08/11(日) 12:32:03.37ID:Vk240t5v 標準環境なら範囲外アクセスはpanicして停止する
Cだとそこに有効なデータがあるものと思ってそのまま操作してしまい、その結果何が起きるか分からないということがある (言語でなくOS側のチェックにより防がれることはある)
no-std環境のRustについては自分も詳しくないので誰か書いてくれ
Cだとそこに有効なデータがあるものと思ってそのまま操作してしまい、その結果何が起きるか分からないということがある (言語でなくOS側のチェックにより防がれることはある)
no-std環境のRustについては自分も詳しくないので誰か書いてくれ
110デフォルトの名無しさん
2024/08/11(日) 12:55:28.88ID:GcC/Tgf1 >>108
Rustでは20個の領域を作った時点で
そこをその先頭アドレス=ポインタで指すのではなく
連続体(スライス)を抽象的な参照で指す
もちろんそのスライスへの参照は内部では先頭アドレスと長さになるが抽象的なスライス参照&[T]として扱う
そこからイテレータは20個の個別参照&Tを連続的に返したりインデックス指定によりget(index)でOption<&T>を得たりできる
21個目のアドレスを得たりその中身を見たりすることはsafeの範囲ではできない
Rustでは20個の領域を作った時点で
そこをその先頭アドレス=ポインタで指すのではなく
連続体(スライス)を抽象的な参照で指す
もちろんそのスライスへの参照は内部では先頭アドレスと長さになるが抽象的なスライス参照&[T]として扱う
そこからイテレータは20個の個別参照&Tを連続的に返したりインデックス指定によりget(index)でOption<&T>を得たりできる
21個目のアドレスを得たりその中身を見たりすることはsafeの範囲ではできない
112デフォルトの名無しさん
2024/08/11(日) 14:30:38.38ID:GcC/Tgf1 抽象的なレベルで安全を確保してしまえばその後にそのコードは最適化し放題
生成アセンブルコードはcargo asmでその場で確認できる
生成アセンブルコードはcargo asmでその場で確認できる
113デフォルトの名無しさん
2024/08/11(日) 15:19:18.37ID:1MlIj3rk >>111
範囲内かどうか比較する処理は入る。
ただし、静的に絶対安全と分かる状況なら最適化で消えることもある。
そうでなくても現代的 CPU だと分岐予測によって速度的ペナルティは小さいことが多い。
ゼロコストというわけではないが、 C 風のポインタがあまりにも素朴でミスしやすいことに対する解決法としては十分以上に小さいコストだと考えられている。
今では C++ にもスライス的な、範囲を表すクラスが標準に追加されていて再編成が進んでるのでやっぱりそのほうがよいという時代の潮流があるんだと思う。
範囲内かどうか比較する処理は入る。
ただし、静的に絶対安全と分かる状況なら最適化で消えることもある。
そうでなくても現代的 CPU だと分岐予測によって速度的ペナルティは小さいことが多い。
ゼロコストというわけではないが、 C 風のポインタがあまりにも素朴でミスしやすいことに対する解決法としては十分以上に小さいコストだと考えられている。
今では C++ にもスライス的な、範囲を表すクラスが標準に追加されていて再編成が進んでるのでやっぱりそのほうがよいという時代の潮流があるんだと思う。
114デフォルトの名無しさん
2024/08/11(日) 15:21:08.97ID:aeJBanf7 またいつもの嘘吐きが
115デフォルトの名無しさん
2024/08/11(日) 16:17:49.13ID:x9x8amRR zigはリリースビルドだと範囲チェックをオフにしちゃうらしい
やっぱゼロコストじゃないよね
やっぱゼロコストじゃないよね
116デフォルトの名無しさん
2024/08/11(日) 16:42:50.50ID:cW25bVgR >>111
例えばスライスをforで回してその値を書き込む関数
#[inline(never)]
fn foo(slice: &[i32]) {
for t in slice {
write_volatile!(VOLATILE, *t);
}
}
生成アセンブリコード
::foo:
test rsi, rsi
je .LBB11_3
shl rsi, 2
xor eax, eax
.LBB11_2:
mov ecx, dword ptr [rdi + rax]
mov dword ptr [rip + ::VOLATILE], ecx
add rax, 4
cmp rsi, rax
jne .LBB11_2
.LBB11_3:
ret
範囲内かどうかのチェックはC/C++と同じくループ内で1箇所のみで同じ動作になる
例えばスライスをforで回してその値を書き込む関数
#[inline(never)]
fn foo(slice: &[i32]) {
for t in slice {
write_volatile!(VOLATILE, *t);
}
}
生成アセンブリコード
::foo:
test rsi, rsi
je .LBB11_3
shl rsi, 2
xor eax, eax
.LBB11_2:
mov ecx, dword ptr [rdi + rax]
mov dword ptr [rip + ::VOLATILE], ecx
add rax, 4
cmp rsi, rax
jne .LBB11_2
.LBB11_3:
ret
範囲内かどうかのチェックはC/C++と同じくループ内で1箇所のみで同じ動作になる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 5:55:55.555
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- 高市さんに土下座してもらったら一発解決なのに何でやらないんだろ??
- 【悲報】男性人気アイドルグループJO1、中国公演中止wwwwwwwwwwwwwwwwwwwwwwwwwww
