探検


Rust part38

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:04:25.76ID:24e2kQId
公式
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/
(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part37
https://mevius.5ch.io/test/read.cgi/tech/1784283151/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
2026/09/21(月) 11:36:54.89ID:TsfRMUJ+
constで
2026/09/21(月) 11:46:14.15ID:LEbdPNEq
Rustのconstはコンパイル時に確定する値しか扱えないよ
staticは実行時に確定する値も扱えるね
2026/09/21(月) 13:09:53.44ID:YzHNkURJ
複おじってOnceLock/LazyLockネタ好きだよね
2026/09/21(月) 13:10:56.53ID:eDapVINV
プログラム実行中に決まる値だけどその後はプログラム終了後まで変わらない値はよくあるけど
それを関数呼び出しするたびに引数として渡して持ち回る方法と
static変数に入れてしまう方法
どちらが便利でコストも低いかという話だよな
2026/09/21(月) 13:16:30.70ID:xBV1TS81
起動引数程度ならどっちでもいいよ
問題はコンパイル通すためにstaticにしたがるやつ
2026/09/21(月) 13:26:12.40ID:dJbgy1B2
不変staticは安全で良い方法だが、staticに親でも殺されたかのように嫌ってる人がいる
2026/09/21(月) 13:30:54.81ID:TsfRMUJ+
Rustって、ROM化出来るん?
2026/09/21(月) 14:03:28.72ID:OHUe+syF
できる
むしろRustができない理由が存在しない
817デフォルトの名無しさん
垢版 |
2026/09/21(月) 14:35:01.23ID:+5XKJfPw
opencode重すぎだからgooseに頑張ってほC
2026/09/21(月) 14:35:55.53ID:H9KETvz/
>>813
起動引数や設定ファイルのデータだけでなく
他のサーバから読み込んだデータなどあらゆる含む
巨大なデータまで全てが対象

・プログラム実行中に必要とするデータ
・プログラム実行中は変化しないデータ
この2点を満たすならばstatic変数に格納することで利便性が高まることが多い
コンパイルを通すために関数の引数として全てを毎回渡して引きずり回すと不利になりがち
2026/09/21(月) 17:09:13.62ID:CklClm5E
>>808
⓪Stringを&strとして共有

これが第一選択肢
2026/09/21(月) 17:21:27.82ID:S88AQXnW
>>819
それは不可能
2026/09/21(月) 18:38:55.58ID:8A7K5noZ
>>819
それはString側のスレッドが先に終わって解放されちゃったり誰にも解放されないままになったり事故多発物件で禁忌だけど
Rustはコンパイルエラーにしてくれる
2026/09/21(月) 19:26:08.22ID:ViIoR4CZ
しょうがないにゃあ
https://crates.io/crates/argv
2026/09/21(月) 19:46:34.91ID:jPdCazQ8
>>822
こっちはちゃんとメモリリークと明記しているのが好感もてる
2026/09/21(月) 20:16:08.52ID:K9rKMqSY
量が分かってるメモリリークは別に問題ないだろ

昔の、main()を抜ける前にfree()すべき論争みたい
2026/09/21(月) 20:30:31.56ID:ma4ce9+I
>>823
勘違いしてるようだがそのクレイトはargvデータを利用できる環境で直接そのデータを利用することでリークなんか一切せずに&'staticを提供するクレイトだぞ
ただしunsafeだらけ
2026/09/21(月) 20:42:35.20ID:ViIoR4CZ
ただしとは?
2026/09/21(月) 20:53:42.98ID:tMMC3trf
ほんとだ
static mutまで使ってやがる
2026/09/21(月) 21:04:24.20ID:AqfCcW0e
大した需要が無い事が判明したね
ダウンロード数からして
2026/09/21(月) 21:08:52.30ID:3ovHO8wn
普通にstd::env使えばunsafe使わずに3行で書けるからなあ
2026/09/21(月) 21:22:23.35ID:6jL4N2Yz
Box::leakで取った参照ってBox::from_rawで戻していいのかな
&strとかスライスだと無理そうだけど&Stringなら大丈夫そうな気がする
2026/09/21(月) 21:26:27.88ID:w2fYUVEb
どのAIも本質的に同じコードを出してくる
once_cell使ったり細かな違いしかない

fn args() -> &'static[&'static str] {
static ARGS_STRING: LazyLock<Vec<String>> = LazyLock::new(|| std::env::args().collect());
static ARGS_STR: LazyLock<Vec<&'static str>> = LazyLock::new(|| ARGS_STRING.iter().map(|s| &**s).collect());
return &**ARGS_STR
}
2026/09/21(月) 21:35:09.56ID:AjhCgfEP
>>825
>>831だとヒープ領域にメモリ確保してリークしてるけど
2026/09/21(月) 21:42:13.71ID:P02CzQjz
メモリリークとはプログラムを動かし続けていると使っていない使用メモリが増え続けていくことだよ
増え続けないものをメモリリークとは言わない
2026/09/21(月) 21:49:47.19ID:ViIoR4CZ
メモリリークの定義はいろいろあります
2026/09/21(月) 22:01:36.60ID:bs8gwQEk
確保したままなのに使われていないメモリ領域が増えていくとメモリリーク
これ以外に定義はない
2026/09/21(月) 22:05:35.92ID:K+qAF0YS
増えていくなんて条件はプログラミング素人過ぎないか?
2026/09/21(月) 22:07:24.58ID:ViIoR4CZ
信仰告白みたいでかっこいいですね

https://valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks
2026/09/21(月) 22:18:29.62ID:828MNJlE
>>820>>821
草w草w
2026/09/21(月) 22:21:40.28ID:JadhMs23
>>837
それは狂信的なので完全に無視していい
少なくともRustの方針とは真逆
Rustは「プログラム終了時にすべてのヒープメモリを返す」という無駄なことをしない方針をとっている
そしてIT大手各社そのRustの方針に賛同しているため現状がある
2026/09/21(月) 22:27:16.47ID:ViIoR4CZ
はあ? 狂信的? 方針? 何の話?
841デフォルトの名無しさん
垢版 |
2026/09/21(月) 22:35:21.70ID:VhTjeoQU
>>824の話だよな
Rustは「main()を抜ける前に全てfree()すべき」というキチガイをガン無視
2026/09/21(月) 22:55:44.23ID:ViIoR4CZ
単にRustがメモリリークについて大した方針も用語定義も持っていないだけでは?

ところで、某「IT大手各社」が言うメモリリークも「増え続ける」なんて条件はない
https://learn.microsoft.com/en-us/cpp/c-runtime-library/find-memory-leaks-using-the-crt-library
2026/09/21(月) 23:03:53.06ID:e5c+uMkQ
>>842
それはダメ言語用
ちゃんと明記されてる
2026/09/21(月) 23:30:10.79ID:ViIoR4CZ
RustプログラムでもCRTはリンクするんじゃないの?
というか言語ごとにメモリリークの定義が違うとかないし関係ないでしょ
2026/09/21(月) 23:34:20.26ID:TsfRMUJ+
メモリー解放やってくれる言語でメモリーリークってあるの?
2026/09/21(月) 23:43:06.97ID:oY6DZ07F
CRTってどの話
公開鍵暗号証明書のCRTか
AWSの共通ランタイムか
2026/09/22(火) 00:35:22.45ID:cK0j03T+
>>845
コンテナに詰めたまま今後使われることも無く放置されるオブジェクトというのは、言語機能も手が出せないからメモリリークということになる
2026/09/22(火) 10:09:10.96ID:bNLehxTt
>>819
他のスレッドへ渡すことができる参照は&'staticだけです
2026/09/22(火) 10:27:39.48ID:4pxM2A40
>>848
嘘おじ乙
2026/09/22(火) 11:39:45.83ID:q5Do/obS
なぜ他のスレッドへ&'static参照しか渡せないのかというと
渡した元のスレッドが先に終了したら参照が指している実体が亡くなってしまうためだよ
&'static以外の参照を渡せるようにするためには他のスレッドが動作中は元のスレッドをブロックして終了しないように制限するしかない
2026/09/22(火) 11:53:56.01ID:MTP/56Du
共有メモリでやりとりするんじゃ無くて?
2026/09/22(火) 12:00:50.22ID:TAf3sznx
お手軽な参照渡しは>>850
所有者はArcに包んで共同所有者になればcloneで共同所有者を増やすことができて他のスレッドへ渡せる
2026/09/22(火) 12:03:50.00ID:6FDtA0Sv
>>848
このレベルの嘘はしょぼいAIでもすぐに看破できるから
嘘つき複製おじさん注意報がなくてもみんなもう大丈夫だよね?
2026/09/22(火) 12:09:22.44ID:xOIplrwn
>>851
スレッドは全メモリ空間を共有するため全てが共有メモリ
だから共有メモリという概念は意味がなくて他から渡されたアドレス領域が参照なのか共同所有なのかという点のみ区別される
2026/09/22(火) 12:11:27.47ID:WqQc5uVE
std::thread::scope
2026/09/22(火) 12:14:30.45ID:lvVWXgg1
>>855
それは自分がブロックされて動作停止になることと引き換えに参照を渡す仕組み
自分が自由に動く場合は&'staticしか渡せない
2026/09/22(火) 12:17:28.17ID:izQVrR2Y
相手のバッファに突っ込んでしまえばいいだけでは?
2026/09/22(火) 12:20:46.33ID:/aCQSoPr
>>857
それはコピー
最もコストが高い
static変数に入れて&'static参照を共有するとコストが安い
2026/09/22(火) 12:22:14.62ID:MTP/56Du
コストより、相手のライフ状態気にしなくてし済む自由
2026/09/22(火) 12:23:02.48ID:DaZhbE7H
AIともこんな調子でバトってるのかな
2026/09/22(火) 12:26:22.07ID:C2KoahVf
>>859
その通り
互いのライフを気にせず共有できる&'staticが自由でいいよ
2026/09/22(火) 12:40:46.70ID:0nX3vX8d
> 問題はコンパイル通すためにstaticにしたがるやつ >>861
2026/09/22(火) 12:49:22.11ID:yoeWEF+y
static変数はスレッド間で共有するために存在してるんだよ
だからこそstatic mutはunsafeでしか扱えないようにしてある
staticで可変にしたい場合は内部可変性を使うことでsafeに使えるよ
2026/09/22(火) 13:00:51.63ID:IGaT0qGE
&'staticを得られるから自由に他スレッドに渡せるだけでなくシングルスレッドの利用でも利点が多い
ライフタイム気にしなくてよくなる
865デフォルトの名無しさん
垢版 |
2026/09/22(火) 13:04:32.19ID:cr0HifoN
>>846
Cathode Ray Tube
2026/09/22(火) 14:50:04.06ID:rR3JhzUW
>>862
ウケた
まさにこれだよな
2026/09/22(火) 14:51:29.96ID:nQd/xlrB
関数の引数として渡すときにもstatic化は効果絶大だよ
直接もしくは連れ回す構造体に格納するとき
1. 所有型(VecやString)を使うと構造体のサイズが割り増しになる
2. 通常の参照を使うと構造体にライフタイム<'a>が付いて扱いが煩雑になる
3. 'static参照を使うと構造体がシンプルで済む
便利で効率も良いのはstatic化した時の 3. だよね
2026/09/22(火) 15:04:40.05ID:6O2cWAgA
結局スレッド云々は全く関係がないんだよな
グローバル変数にして個別に受け渡しせず使いたいならstaticにする
それだけ

グローバル変数は
依存性が隠れやすい/テストしにくいなどのダウンサイドもあるので
用法用量には注意しましょうということ

複おじ節には耳をかすな
これだけでいい
2026/09/22(火) 15:14:50.45ID:jVMf5Btc
static変数はグローバル変数ではありません
テストがしにくくなることもありません
2026/09/22(火) 15:20:16.77ID:wJ8CVmO0
>>868
基本的な違いをいくつも理解できてないな
まず指摘があるようにstatic変数はグローバル変数ではなくスコープは関数内やモジュール内に閉じて使える
次にstatic変数を直接使う話ではなくてそれが見えない場所からも使える&'static参照の話だろう
2026/09/22(火) 15:21:25.46ID:DaZhbE7H
「バカは'static以外のライフタイム使わないほうがいい」はガチ
2026/09/22(火) 15:41:20.58ID:1FMPzNcm
>>871
ライフタイムが難しいなんてことはないでしょ
ここでもライフタイム注釈付けたり面倒という声はあっても難しいとか見かけない
2026/09/22(火) 16:30:49.95ID:mb5/PVHr
&str の lifetime に納得行かないのなら
&'static str より String 使え
2026/09/22(火) 16:39:33.99ID:Dlcehamx
>>873
参照を渡して共有したい話だから
String直接渡すならcloneになってしまうぞ
&'static strの方が何もかも良い
2026/09/22(火) 17:22:46.10ID:X93HRnuq
すべったね
2026/09/22(火) 17:28:58.82ID:9iufHjYY
しかもスレッドに渡すなら
文字列を渡したいだけなのに
&'static str vs. Arc<String>になってしまうもんな
2026/09/22(火) 18:24:55.02ID:HJSsYxXe
複おじ(2022)「可変性を気にしなくてよくなるからCell使え」
複おじ(2026)「ライフタイム気にしなくてよくなるから&'static使え」

1ミリも進歩してないwww
2026/09/22(火) 18:29:20.00ID:DaZhbE7H
令和最新版staticおじさん
2026/09/22(火) 19:34:33.89ID:JjocWP+j
どんなものでも用いることでコードがシンプルになったり速くなったりするなら使うのが正解
unsafeは除く
2026/09/22(火) 21:06:58.96ID:OwGqJ8SC
なんでもArcにすると扱いが楽!は遅くなるからダメだけど
>>877は問題ないと思う
881デフォルトの名無しさん
垢版 |
2026/09/22(火) 21:46:26.41ID:dZHoI6bq
CPUバウンドな処理をスレッドで回したいだけなら安直にrayonで書く
プロファイラかけてボトルネックだとなったらゼロコピーで書き直す
そうそうない
2026/09/22(火) 21:57:02.17ID:nl5zGx1z
これ書き味悪すぎるだろ
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/3.rs

こんな風に書けないものか
https://godbolt.org/z/dEv1EPKT9
2026/09/22(火) 22:03:22.11ID:Z9tABGZi
分割できるなんらかの計算処理以外にrayon活用無理だろ
2026/09/22(火) 22:18:24.35ID:rLmwJ50F
>>882
非同期で書く課題だから他の言語は非同期を使ってるいるのに1人だけ非同期ではないのは恥ずかしい
2026/09/22(火) 22:26:59.47ID:nl5zGx1z
generatorはコルーチンだよ
2026/09/22(火) 22:29:08.11ID:DaZhbE7H
C++読む気ないのにこれだからなあ
2026/09/22(火) 22:31:19.91ID:nl5zGx1z
>>884
もうちょっと詳しく書くと
>>882のC++コードはこれに対応している
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/2.py
ただしPythonは再帰呼び出しでスタックオバーフローする
2026/09/22(火) 22:35:00.67ID:ql3fUNJl
ざっと見たところPythonもJavaScriptもC#もGoもRustも非同期タスクを使っているようだ
非同期タスクを使う課題なのではないか?
2026/09/22(火) 22:38:54.92ID:1Jvzfdv3
1.pyなど1.*しか見てなかったからasync使うベンチマークかと思ったら2.pyはasync出て来ないのな
出題が悪いのではないか
2026/09/22(火) 22:43:39.10ID:nl5zGx1z
>>888
非同期機構のプリミティブは言語毎に違うけどC++はプロミスで
std::generatorはsingle threaded executorだからJavascriptよりかな

C++コードが登録されてないのはこれが流行ったのが昔だからでは
2026/09/22(火) 22:44:53.33ID:nl5zGx1z
>>889
カラーレスのgoでチャンネルを使ったのがひな型
2026/09/22(火) 22:51:10.96ID:fLfMQzIX
シングルスレッドの生成器でいいなら
C++の1つ目のジェネレータはRustでは「2..」
2つ目は「(2..).filter(|&i| i % prime != 0)」
しかしそのようなコードを期待されているベンチマークではないと思われる
2026/09/22(火) 22:53:59.02ID:nl5zGx1z
>>892
それだと非同期機構が関与してない
2026/09/22(火) 23:07:56.50ID:DaZhbE7H
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=c97f4c4b1a3a952e5ac727c78bf8ffa3

なんかStreamってあったよなってヒントを与えつつローカルのQwen3.8に書かせてみたけどこんな感じでよか?
2026/09/22(火) 23:11:57.34ID:Sxew/Luk
C++のそのco_yieldもそれだけでは非同期スケジューリングされる非同期タスクは生成されないぞ
2026/09/22(火) 23:19:14.78ID:nl5zGx1z
>>894
これいい感じ

>>895
894も882と同じだし
言語毎に非同期機構のデフォルトがeagerがlazyか違うのでそこは関係ないかと
2026/09/22(火) 23:19:55.91ID:LbBY0mHk
>>882
そのC++のコードのどこに非同期性があるんだよ
全て同期だ
2026/09/22(火) 23:23:17.72ID:nl5zGx1z
>>897
>>896

非同期機構を使って書いたコードが実際にawaitなどで非同期タスクスイッチが起こるかどうかはこのベンチマークの主眼じゃないかと
2026/09/22(火) 23:25:09.94ID:LbBY0mHk
>>893でRustのコードに対して非同期機構が関与してないと指摘してるようだが
C++のそのコードも同期のみで同じ
2026/09/22(火) 23:27:07.78ID:nl5zGx1z
>>899
もう面倒なので自分で勉強してね
2026/09/22(火) 23:35:38.48ID:/rwn5ZOW
C++は非同期ランタイムの標準化に失敗して先送りになったままだったと思う
std::executionが決まらないとC++では無理かと
2026/09/22(火) 23:38:37.68ID:nl5zGx1z
>>901
どうぞ
https://github.com/nvidia/stdexec
2026/09/22(火) 23:43:05.13ID:HA//Kc90
>>902
その非同期スケジューラーを使って非同期に書くといいんじゃね
904デフォルトの名無しさん
垢版 |
2026/09/22(火) 23:43:06.40ID:dZHoI6bq
コルーチンの比較ベンチで非同期かどうかは関係ないような
グリーンスレッドが標準化されてない環境だと重たくなるのはしかたない
RustはTokioがデファクトだからまああり
2026/09/22(火) 23:48:37.89ID:nXou4Xqi
ID:nl5zGx1zの書き込みを見てると非同期に書いたつもりになってるようだけど非同期になってないですよね
2026/09/22(火) 23:49:47.31ID:nl5zGx1z
>>905
だから勉強しなさいって
2026/09/22(火) 23:52:49.12ID:DaZhbE7H
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2024&gist=9a70f86f7c3c8f25cf743142489b882f

yieldで書きたければ今のnightlyだとこれくらいまではできるみたいね
gen {}はなんかCoroutine実装してないとか言われてだめだった…
2026/09/22(火) 23:54:46.40ID:i4Iz/fDI
単なるコルーチンだな
構成要素の一部にはなり得るけど非同期とは別
レス数が900を超えています。1000を超えると表示できなくなるよ。

ニューススポーツなんでも実況