公式
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 part25
https://mevius.5ch.net/test/read.cgi/tech/1722354386/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part26
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2024/09/20(金) 22:18:38.38ID:c48cFuZJ671デフォルトの名無しさん
2024/11/08(金) 20:12:43.27ID:3z6JS0FZ >>669
正規表現パターンに変数やその式を使ったことないのかい?
それら式を用いるとコンパイル結果を自分でキャッシュ管理しなければならなくなる
具体的にはregex literalの有無で
(1) 無い言語の例としてPythonは効率化のためにはre.compile(パターン, ...)結果のキャッシュが必要
(2) 有る言語の例としてRubyは式を含む場合のみ毎回評価し直すためキャッシュが必要
(3) 有るがパターンに式を書けない言語の例としてJavaScriptはnew RegExp(パターン, ...)結果のキャッシュが必要
いずれもregex literalの有無に関わらずコンパイル結果のキャッシュが必要となる
正規表現パターンに変数やその式を使ったことないのかい?
それら式を用いるとコンパイル結果を自分でキャッシュ管理しなければならなくなる
具体的にはregex literalの有無で
(1) 無い言語の例としてPythonは効率化のためにはre.compile(パターン, ...)結果のキャッシュが必要
(2) 有る言語の例としてRubyは式を含む場合のみ毎回評価し直すためキャッシュが必要
(3) 有るがパターンに式を書けない言語の例としてJavaScriptはnew RegExp(パターン, ...)結果のキャッシュが必要
いずれもregex literalの有無に関わらずコンパイル結果のキャッシュが必要となる
672デフォルトの名無しさん
2024/11/08(金) 20:55:31.49ID:Me1tPYCI ものによるが暗黙にキャッシュする (プログラマが保存しないでよい) 言語処理系は存在するよ。
673デフォルトの名無しさん
2024/11/08(金) 21:02:51.24ID:yNVczeuC むしろ、コンパイルしてないほう(Arc<String>)をキャッシュする
そのStringが生きている間だけコンパイル結果を生かしておく
キャッシュが必要ならArcが必要と判明したせいでGC界隈の常識が覆された
そのStringが生きている間だけコンパイル結果を生かしておく
キャッシュが必要ならArcが必要と判明したせいでGC界隈の常識が覆された
674デフォルトの名無しさん
2024/11/08(金) 21:23:43.02ID:3z6JS0FZ675デフォルトの名無しさん
2024/11/08(金) 21:40:49.75ID:Me1tPYCI >>674
いや、キャッシュというかいわゆるメモ化かな。
入力される値は変わりうるが、同じ入力に対しては同じ結果であることは保証される (かつ現実的な用途では同じ値が入力される可能性が高い) ので値とセットで記憶しておく方法で十分に処理コストを減らせる。
いや、キャッシュというかいわゆるメモ化かな。
入力される値は変わりうるが、同じ入力に対しては同じ結果であることは保証される (かつ現実的な用途では同じ値が入力される可能性が高い) ので値とセットで記憶しておく方法で十分に処理コストを減らせる。
676デフォルトの名無しさん
2024/11/08(金) 21:58:06.73ID:HF5jYlyP 全く異なるユースケースを持ち出してまで
「どの言語も同じ」ということにしたいらしい
「どの言語も同じ」ということにしたいらしい
677デフォルトの名無しさん
2024/11/08(金) 22:27:14.73ID:Jmd1EJmL >>674
Pythonのreなら直近の512個まで自動的にキャッシュされてるよ
Pythonのreなら直近の512個まで自動的にキャッシュされてるよ
678デフォルトの名無しさん
2024/11/08(金) 22:28:21.24ID:Me1tPYCI ワンライナーみたいな使い方をする言語では (結果的に無駄になってでも) 暗黙に色々やっといてくれるほうが便利ってこともあるからどんな言語でも Rust と同じ方式のはずとは言えんわな。
679デフォルトの名無しさん
2024/11/08(金) 23:01:18.69ID:spBkjUqU680デフォルトの名無しさん
2024/11/08(金) 23:54:55.29ID:B3hB3UkR681デフォルトの名無しさん
2024/11/09(土) 00:23:52.73ID:3a9p/42P それはRegexの内部実装なので無関係だね
CloneできるようにArcを使ってるよくある手だよ
CloneできるようにArcを使ってるよくある手だよ
682デフォルトの名無しさん
2024/11/09(土) 01:08:06.88ID:CKaEi0Af ?
内部実装の話をしてるんではないのか
内部実装の話をしてるんではないのか
683デフォルトの名無しさん
2024/11/09(土) 01:20:28.66ID:3a9p/42P 再コンパイルを避けるためにstaticで持ったりオブジェクトメンバーで持ったりと利用プログラマー側の話でしょ
その時に必要ならCloneもできるということ
その時に必要ならCloneもできるということ
684デフォルトの名無しさん
2024/11/09(土) 01:27:01.06ID:NTU1NPwJ 何の話をしてるのか、誰か一人でも分かってるんだろうか
685デフォルトの名無しさん
2024/11/09(土) 04:13:52.23ID:MgyqC3I+686デフォルトの名無しさん
2024/11/09(土) 05:26:31.68ID:tGFuX1+9 話の流れが良く分からないけど、つまり正規表現をconst文脈でコンパイルできないRustはクソってこと?
687デフォルトの名無しさん
2024/11/09(土) 09:50:01.85ID:V8dNW5L0 単に複オジがクソだってこと
688デフォルトの名無しさん
2024/11/09(土) 12:02:14.96ID:6/tB/poi いわゆるlet over lambdaがなかった時代には
static over fn
だったという話
static over fn
だったという話
689デフォルトの名無しさん
2024/11/09(土) 12:56:57.97ID:Z6VLqth0 コーディング時に確定できる静的な正規表現と
実行時にならないと確定できない動的な正規表現は
用途も違うしプログラム内での扱い方も全然違うよね
前者が他言語なら正規表現リテラルでRustならstaticを使う分野
後者は普通staticは使わない(immutableなのかmutableなのかでまた少し違う)
Javaでstaticというのは前者だろうな
後者でも使えなくはないけど純Java脳の人は違うやり方をするはず
実行時にならないと確定できない動的な正規表現は
用途も違うしプログラム内での扱い方も全然違うよね
前者が他言語なら正規表現リテラルでRustならstaticを使う分野
後者は普通staticは使わない(immutableなのかmutableなのかでまた少し違う)
Javaでstaticというのは前者だろうな
後者でも使えなくはないけど純Java脳の人は違うやり方をするはず
690デフォルトの名無しさん
2024/11/09(土) 13:21:26.67ID:F1r07c7a いつになったら、Rustで正規表現をconst文脈でコンパイルできるようになるの?
原理的に見込みない話?
原理的に見込みない話?
691デフォルトの名無しさん
2024/11/09(土) 14:07:10.40ID:6/tB/poi ヒープの話に戻るが、サイズが静的に確定すればヒープを一切使わない保証もできる
692デフォルトの名無しさん
2024/11/09(土) 14:59:50.94ID:JFkCBQN+693デフォルトの名無しさん
2024/11/09(土) 15:06:22.46ID:CKaEi0Af694デフォルトの名無しさん
2024/11/09(土) 15:09:47.03ID:F1r07c7a695デフォルトの名無しさん
2024/11/09(土) 17:12:28.10ID:bFGQ+yoR696デフォルトの名無しさん
2024/11/09(土) 17:13:55.79ID:6/tB/poi 願望は笑いものになるが失望はそうでもない
前者は単独犯で後者は不特定多数だからだ
前者は単独犯で後者は不特定多数だからだ
697デフォルトの名無しさん
2024/11/09(土) 17:22:40.75ID:IbVEcqQg 正規表現の単なる説明例じゃないのか
しかも正規表現自体も単なる例でstaticに突っ込む話の説明例だろ
そもそもの話はヒープをプログラムの最後まで解放しなくていい話でstaticはその一例として出てきただけだよな
一番どうでもいい末節の正規表現で騒いでいて違和感
しかも正規表現自体も単なる例でstaticに突っ込む話の説明例だろ
そもそもの話はヒープをプログラムの最後まで解放しなくていい話でstaticはその一例として出てきただけだよな
一番どうでもいい末節の正規表現で騒いでいて違和感
698デフォルトの名無しさん
2024/11/09(土) 17:29:31.37ID:8+qKiGsp >>693
読んでみたが機能充実(制限)と実行速度とバイナリサイズのどれを優先するかもしくはどの二つまで両立させるかで
どのエンジンやどんな中間表現やどこまで機能制限を行なうかのバリエーションが多すぎるようだ
万人の矛盾した要求を全て満たす万能なものを実現するのは不可能だから別々に叶えるしかないな
読んでみたが機能充実(制限)と実行速度とバイナリサイズのどれを優先するかもしくはどの二つまで両立させるかで
どのエンジンやどんな中間表現やどこまで機能制限を行なうかのバリエーションが多すぎるようだ
万人の矛盾した要求を全て満たす万能なものを実現するのは不可能だから別々に叶えるしかないな
699デフォルトの名無しさん
2024/11/09(土) 18:03:48.00ID:LybhxYMR >>690
RustのconstってC++のconstexprだよな
どうやってヒープ領域を返すんだ?
C++だとconstexprの計算中はnew/deleteでヒープを一時利用できるけど
deleteせずに返すのはできないよな
RustのconstってC++のconstexprだよな
どうやってヒープ領域を返すんだ?
C++だとconstexprの計算中はnew/deleteでヒープを一時利用できるけど
deleteせずに返すのはできないよな
700デフォルトの名無しさん
2024/11/09(土) 18:14:19.13ID:6/tB/poi 正規とか文脈自由とかいうのは仕様のバリエーション
実装のバリエーションなど知ったことではない
実装のバリエーションなど知ったことではない
701デフォルトの名無しさん
2024/11/09(土) 22:22:44.34ID:bFGQ+yoR >>697
例として出したものが
正規表現リテラルの代替策な上に
内部実装の都合上ヒープを確保してるだけで
本来はヒープである必然性もない
機能不足の代替策として
プログラムの最後まで開放しないような
ヒープの使い方もあるだろうという話なのか?
例として出したものが
正規表現リテラルの代替策な上に
内部実装の都合上ヒープを確保してるだけで
本来はヒープである必然性もない
機能不足の代替策として
プログラムの最後まで開放しないような
ヒープの使い方もあるだろうという話なのか?
702デフォルトの名無しさん
2024/11/09(土) 23:06:21.72ID:6/tB/poi ロックして解放してロック解除しなければいい
703デフォルトの名無しさん
2024/11/09(土) 23:11:14.97ID:Dc7LpAyZ704デフォルトの名無しさん
2024/11/10(日) 00:07:10.13ID:QiolRTDD705デフォルトの名無しさん
2024/11/10(日) 02:33:30.98ID:OGC8ujy2 は~~~~キレそう
706デフォルトの名無しさん
2024/11/10(日) 02:34:34.55ID:OGC8ujy2 なんの意味があんねや、このスレ
707デフォルトの名無しさん
2024/11/10(日) 02:36:54.54ID:OGC8ujy2 Rustプログラマにとって有益な情報はこれ以上出ないし、まともなRustプログラマは全員逃げたことが確定して久しいので
次スレあたりから「Rust vs 世界中の全言語 Part27」とか「複製おじさんと遊ぼう Part27」とかにしましょっか
他にもスレタイ案募集
次スレあたりから「Rust vs 世界中の全言語 Part27」とか「複製おじさんと遊ぼう Part27」とかにしましょっか
他にもスレタイ案募集
708デフォルトの名無しさん
2024/11/10(日) 06:48:35.70ID:xIqOi7JH709デフォルトの名無しさん
2024/11/10(日) 11:17:24.55ID:dkv1a77w 入力がコンパイル時に確定してるならサイズも確定するでしょ
理屈としては以下のようなものは作れると思う
struct CompTimeRegex<const N: usize> {
data: [u8; N]
}
// 正規表現オブジェクトをコンパイル時に計算
// サイズは入力に応じて変わる
// 入力はリテラルのみ
let r = make_regex!("+\\d");
面倒だし、それでパフォーマンスが劇的に良くなるわけでも無いだろうから必要性は微妙なところ
詳しくないけど、手続きマクロの中なら計算のためにヒープを使うこともできるよね?
理屈としては以下のようなものは作れると思う
struct CompTimeRegex<const N: usize> {
data: [u8; N]
}
// 正規表現オブジェクトをコンパイル時に計算
// サイズは入力に応じて変わる
// 入力はリテラルのみ
let r = make_regex!("+\\d");
面倒だし、それでパフォーマンスが劇的に良くなるわけでも無いだろうから必要性は微妙なところ
詳しくないけど、手続きマクロの中なら計算のためにヒープを使うこともできるよね?
710デフォルトの名無しさん
2024/11/10(日) 11:58:38.78ID:WMkhj3nA BurntSushiのベンチ結果見た?
711デフォルトの名無しさん
2024/11/10(日) 12:03:57.56ID:xIqOi7JH それは入力固定で出力の型も別仕様の別の話だな
regex::Regexは実行時に正規表現が作られてもよく
それをコンパイルするためヒープが
使われている
regex::Regexは実行時に正規表現が作られてもよく
それをコンパイルするためヒープが
使われている
712デフォルトの名無しさん
2024/11/10(日) 12:23:01.33ID:mfp7bShs 正規表現をコンパイルするのと比べてヌル代入を許容するのは極めて容易で
ヌルを代入すればヒープが解放される
ヌルを代入すればヒープが解放される
713デフォルトの名無しさん
2024/11/10(日) 12:27:06.24ID:z1ldQRPb const文脈って、実際今なんか有効な活用されてるの?
714デフォルトの名無しさん
2024/11/10(日) 12:30:28.79ID:z1ldQRPb ちなみにzigの似た機能は有効活用されまくり
715デフォルトの名無しさん
2024/11/10(日) 12:38:27.50ID:OGC8ujy2 ぐちゃぐちゃできるとかできない言ってるが自分で実装する気のある人間は一人もいねえんだろ???
だったら終わりだよ
だったら終わりだよ
716デフォルトの名無しさん
2024/11/10(日) 13:02:04.64ID:OGC8ujy2717デフォルトの名無しさん
2024/11/10(日) 13:06:11.38ID:OGC8ujy2 意図的な誤読、ストローマン論法、誰もがわかりきった説明を脈絡無く貼って議論を拡散させる
マジで不毛
マジで不毛
718デフォルトの名無しさん
2024/11/10(日) 13:11:04.55ID:OGC8ujy2 結局さ
ヒープは全部開放しなさい派閥は>>661のコードでRegex内部のArcが未解放のままプロセス終了するのは、ええんか??ええんか??どうなんだオラ??って話ってことでええんよな
ヒープは全部開放しなさい派閥は>>661のコードでRegex内部のArcが未解放のままプロセス終了するのは、ええんか??ええんか??どうなんだオラ??って話ってことでええんよな
719デフォルトの名無しさん
2024/11/10(日) 13:16:48.60ID:xIqOi7JH >>716
全く別の話であり、これまでのregex::Regexについての話への言及・反論にはなっていないことを自覚できているならそれでよろしい
全く別の話であり、これまでのregex::Regexについての話への言及・反論にはなっていないことを自覚できているならそれでよろしい
720デフォルトの名無しさん
2024/11/10(日) 13:18:41.74ID:nOHdM7oG >>718
Rustの標準ライブラリstdは
プログラム終了時に自動的にメモリが解放されるようなまともなOS環境を対象にしていて区別しているので大丈夫
OS無しの組み込み環境では#![no_std]を宣言してcoreライブラリのみサポートされる中でのプログラミングを行なう
Rustの標準ライブラリstdは
プログラム終了時に自動的にメモリが解放されるようなまともなOS環境を対象にしていて区別しているので大丈夫
OS無しの組み込み環境では#![no_std]を宣言してcoreライブラリのみサポートされる中でのプログラミングを行なう
721デフォルトの名無しさん
2024/11/10(日) 14:48:06.15ID:AfmJKCJ3 >>707
みんな何処に逃げた?
みんな何処に逃げた?
722デフォルトの名無しさん
2024/11/10(日) 15:04:06.89ID:qC3Ky4ZL >>661
スコープを外れた場合と同じようにモジュールがアンロードされる際にデストラクトされる
スコープを外れた場合と同じようにモジュールがアンロードされる際にデストラクトされる
723デフォルトの名無しさん
2024/11/10(日) 16:19:33.44ID:OGC8ujy2 >>720
OS側でプロセスを終了させる際にメモリマップを捨てる処理のことを「解放」って呼んでるから君と君以外で話がすれ違うんだと思うよ
OS側でプロセスを終了させる際にメモリマップを捨てる処理のことを「解放」って呼んでるから君と君以外で話がすれ違うんだと思うよ
724デフォルトの名無しさん
2024/11/10(日) 16:24:01.76ID:OGC8ujy2725デフォルトの名無しさん
2024/11/10(日) 16:26:17.63ID:OGC8ujy2726デフォルトの名無しさん
2024/11/10(日) 16:30:14.58ID:dkv1a77w 5chで聞くよりもChatGPTの方が適切な回答をくれると思う
Rustに限らず他の言語でも
Rustに限らず他の言語でも
727デフォルトの名無しさん
2024/11/10(日) 16:34:57.50ID:OGC8ujy2 ChatGPTもついでにCopilot Chatもゴミだよ
省略されたライフタイムの展開が自分でやったのが合ってるか自信がなくて、試しにやらせてみたらメチャクチャなことばっか言いやがった挙げ句、キレてthe Refrenceのelision rulesのところをペタペタ3回くらいコピペしたらすみません間違っていました、何度も申し訳ございません言いながらやっと正解を返してくれた
決定論的な問題を解かせるのにはまったく向いてない
省略されたライフタイムの展開が自分でやったのが合ってるか自信がなくて、試しにやらせてみたらメチャクチャなことばっか言いやがった挙げ句、キレてthe Refrenceのelision rulesのところをペタペタ3回くらいコピペしたらすみません間違っていました、何度も申し訳ございません言いながらやっと正解を返してくれた
決定論的な問題を解かせるのにはまったく向いてない
728デフォルトの名無しさん
2024/11/10(日) 16:36:43.08ID:z1ldQRPb >>727
最初からキレて始めればいいのでは?
最初からキレて始めればいいのでは?
729デフォルトの名無しさん
2024/11/10(日) 16:39:08.93ID:OGC8ujy2 英語が話せる人はこっちに移住しよう!!! できない人もDeepL片手にカモン!!!
https://www.rust-lang.org/community
日本語コミュはこちら!!!ってかいい加減放置されきった翻訳版の責任者のケツ叩きに行こうぜ!!!
https://rust-lang-jp.zulipchat.com/
https://www.rust-lang.org/community
日本語コミュはこちら!!!ってかいい加減放置されきった翻訳版の責任者のケツ叩きに行こうぜ!!!
https://rust-lang-jp.zulipchat.com/
730デフォルトの名無しさん
2024/11/10(日) 16:41:30.83ID:tFJCBt9m >>728
キレるはともかく最初からelision rules貼ればよかった説は確かにそう、残念ながら二回目の機会がないが次はそうしてみるぜ
でもよお……こんなのrust-analyzerが完璧なinlay hint実装してくれりゃやらなくて済む話でもあるんだぜ
キレるはともかく最初からelision rules貼ればよかった説は確かにそう、残念ながら二回目の機会がないが次はそうしてみるぜ
でもよお……こんなのrust-analyzerが完璧なinlay hint実装してくれりゃやらなくて済む話でもあるんだぜ
731デフォルトの名無しさん
2024/11/10(日) 16:42:25.60ID:OGC8ujy2 およ? ID変わった
ID:OGC8ujy2=ID:tFJCBt9mです
ID:OGC8ujy2=ID:tFJCBt9mです
732デフォルトの名無しさん
2024/11/10(日) 16:53:56.32ID:ES+o9VJl >>722
staticはdrop呼ばれない
staticはdrop呼ばれない
733デフォルトの名無しさん
2024/11/10(日) 17:11:30.76ID:a6nPaG4v C++ で static オブジェクトの初期化順 (解体順) は問題を起こしがちだし、いっそそのへんは取り扱わないというのも妥当な判断のひとつではあるわな。
734デフォルトの名無しさん
2024/11/10(日) 17:43:15.44ID:mfp7bShs 自動化をあきらめることは賛成
だが手動で解放する技術を不要な技術と見なすことには反対する
だが手動で解放する技術を不要な技術と見なすことには反対する
735デフォルトの名無しさん
2024/11/10(日) 18:43:44.99ID:dkv1a77w StringやVecみたいなヒープを使う型をstaticで管理させた場合って、valgrindみたいなメモリリーク検出ツールに引っかかったりする?
dropが呼ばれなくても終了時に一応はメモリ解放してるのか、それとも本当に何もしていないのか
dropが呼ばれなくても終了時に一応はメモリ解放してるのか、それとも本当に何もしていないのか
736デフォルトの名無しさん
2024/11/10(日) 19:15:15.74ID:xIqOi7JH >>733
Rustならstatic変数初期化はOnceLockやLazyLockでマルチスレッド競合を含めて安全に初期化できる
static変数でdropはプログラムの終了時も起きないがメモリ解放問題は普通のOS環境では関係ないため問題ない
どうしてもdropしたいなら例えばOptionで包んでtake()で取り出すなどで手動drop()が可能
>>735
手動dropしないならばヒープ領域を持っていても解放されない
これはBox::leak()などで意図的にメモリを解放しないようにした場合でも同様
普通のOS環境ならこれでも問題は全く起きないが
組み込み環境などで確実にメモリ解放したいならば用意するメモリアロケータで対応する
つまりプログラム終了時にメモリアロケータを呼び出して管理している全メモリを解放させればよい
Rustならstatic変数初期化はOnceLockやLazyLockでマルチスレッド競合を含めて安全に初期化できる
static変数でdropはプログラムの終了時も起きないがメモリ解放問題は普通のOS環境では関係ないため問題ない
どうしてもdropしたいなら例えばOptionで包んでtake()で取り出すなどで手動drop()が可能
>>735
手動dropしないならばヒープ領域を持っていても解放されない
これはBox::leak()などで意図的にメモリを解放しないようにした場合でも同様
普通のOS環境ならこれでも問題は全く起きないが
組み込み環境などで確実にメモリ解放したいならば用意するメモリアロケータで対応する
つまりプログラム終了時にメモリアロケータを呼び出して管理している全メモリを解放させればよい
737デフォルトの名無しさん
2024/11/10(日) 19:59:43.87ID:tFJCBt9m 質問の答えになってないし、組み込み環境で「プログラムが終了」したり、「管理している全メモリを解放」できるアロケータが必要などとまで言い出した
いやはや
いやはや
738デフォルトの名無しさん
2024/11/10(日) 20:16:38.46ID:tFJCBt9m >>735
>>661に適当にこれだけのmain足してvalgrindかけてみた
fn main() {
let s = "2021/07/04";
let (year, month, day) = yyyymmdd(s).unwrap();
println!("{}-{}-{}", year, month, day);
}
https://pastebin.com/UN84vEFb
まあ、リーク扱いで出るよね
こういうのがあんまり多いとマジのリークと区別付きづらくて大変そうだけど、なんかアノテーションみたいなので対策できたりするのかな?
>>661に適当にこれだけのmain足してvalgrindかけてみた
fn main() {
let s = "2021/07/04";
let (year, month, day) = yyyymmdd(s).unwrap();
println!("{}-{}-{}", year, month, day);
}
https://pastebin.com/UN84vEFb
まあ、リーク扱いで出るよね
こういうのがあんまり多いとマジのリークと区別付きづらくて大変そうだけど、なんかアノテーションみたいなので対策できたりするのかな?
739デフォルトの名無しさん
2024/11/10(日) 20:28:05.31ID:dkv1a77w >>738
サンクス
過去にC++で似たようなケースで顧客から「あなたの所のライブラリを使うとメモリリークが検出されるんだけど?」って指摘されたことがあって気になった
説明して伝わる相手なら良いけど、そういう面倒な人からのクレームを避けたい場合はstaticは避けたほうが良さそうだな
本質的には重要な問題でないと思うけども
サンクス
過去にC++で似たようなケースで顧客から「あなたの所のライブラリを使うとメモリリークが検出されるんだけど?」って指摘されたことがあって気になった
説明して伝わる相手なら良いけど、そういう面倒な人からのクレームを避けたい場合はstaticは避けたほうが良さそうだな
本質的には重要な問題でないと思うけども
740デフォルトの名無しさん
2024/11/10(日) 20:28:35.21ID:xIqOi7JH >>737
組み込み環境であろうとなかろうと各プログラムは終了する
さらにOS環境でOS内であっても各カーネルモジュールのプログラムはアンロードで終了する
一方でもし完全にモノリシックな一つのシステムなら終了後をそもそも考える必要がない
メモリアロケータについては自作したことあるなら管理してるメモリの全解放なんて楽勝だと理解できるだろ
割り当て用に確保しているバッファを返却するだけだ
組み込み環境であろうとなかろうと各プログラムは終了する
さらにOS環境でOS内であっても各カーネルモジュールのプログラムはアンロードで終了する
一方でもし完全にモノリシックな一つのシステムなら終了後をそもそも考える必要がない
メモリアロケータについては自作したことあるなら管理してるメモリの全解放なんて楽勝だと理解できるだろ
割り当て用に確保しているバッファを返却するだけだ
741デフォルトの名無しさん
2024/11/10(日) 20:52:25.18ID:Qvjt9L31 お前ら、Rustでプログラム書いた後にvalgrind ってるの?
もうそういうの終わりにしたいからRust使ってるんじゃないの?
もうそういうの終わりにしたいからRust使ってるんじゃないの?
742デフォルトの名無しさん
2024/11/10(日) 20:53:16.70ID:tFJCBt9m 相変らず単語ひとつひとつが独自用法すぎて解読が困難だね
mallocみたいなグローバルアロケータを自分で実装しようという話をしているのか?
それとも(allocator_apiがいまだにunstableなせいでボイラープレートモリモリ書かされる)typed_arenaやbumpaloのようなカスタムアロケータの話をしているのか?
前者だとしたらバッファという言葉が出てくるのがまず分からない、もしかしてヒープ領域全体のことをバッファと呼んでいて、確保/解放はsbrkのことを言っているのか?
後者だと「管理してるメモリの全解放」ですべての内容のDropしないといけなくて……って考えるとどう考えてもゲロクソむずいけど、全オブジェクトをManuallyDropに包んで返して責任放棄するのかな……
mallocみたいなグローバルアロケータを自分で実装しようという話をしているのか?
それとも(allocator_apiがいまだにunstableなせいでボイラープレートモリモリ書かされる)typed_arenaやbumpaloのようなカスタムアロケータの話をしているのか?
前者だとしたらバッファという言葉が出てくるのがまず分からない、もしかしてヒープ領域全体のことをバッファと呼んでいて、確保/解放はsbrkのことを言っているのか?
後者だと「管理してるメモリの全解放」ですべての内容のDropしないといけなくて……って考えるとどう考えてもゲロクソむずいけど、全オブジェクトをManuallyDropに包んで返して責任放棄するのかな……
743デフォルトの名無しさん
2024/11/10(日) 20:56:00.86ID:tFJCBt9m >>741
できねーもんはできねーんだから適切な道具を使うんだよ、笑うならそこの嘘吐き宣教師を笑うんだな
できねーもんはできねーんだから適切な道具を使うんだよ、笑うならそこの嘘吐き宣教師を笑うんだな
744デフォルトの名無しさん
2024/11/10(日) 21:08:26.24ID:xIqOi7JH >>742
プログラム本体終了後のメモリ解放のためにdropは必要ない
プログラム全体終了後のメモリリークが組み込みなどで困るケースが対象なのだからそれらメモリを返却するだけでよい
sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだが
それをしなくてもプログラム終了後にメモリリークは起きないので普通のアロケータでは行われていない
メモリリークが起きうる特殊なOSや組み込みならアロケータが借りてるメモリを全返却すればよい
プログラム本体終了後のメモリ解放のためにdropは必要ない
プログラム全体終了後のメモリリークが組み込みなどで困るケースが対象なのだからそれらメモリを返却するだけでよい
sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだが
それをしなくてもプログラム終了後にメモリリークは起きないので普通のアロケータでは行われていない
メモリリークが起きうる特殊なOSや組み込みならアロケータが借りてるメモリを全返却すればよい
745デフォルトの名無しさん
2024/11/10(日) 21:16:26.31ID:tFJCBt9m >>744
んでどっちのアロケータの話をしてるの?って
んでどっちのアロケータの話をしてるの?って
746デフォルトの名無しさん
2024/11/10(日) 21:22:25.58ID:xIqOi7JH >>745
普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きないから対策の必要がない
そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない
普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きないから対策の必要がない
そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない
747デフォルトの名無しさん
2024/11/10(日) 21:35:16.61ID:tFJCBt9m748デフォルトの名無しさん
2024/11/10(日) 21:41:49.64ID:tFJCBt9m 少なくともvalgrindとかperfmonみたいなやつは、プログラム終了時にヒープを辿って解放済みマークの無い場所を見つけたらリークって報告するんだし、一般的にはそれがリークだよ
プロセス終了時にメモリマップの割り当てが解除されるとか、どうでもええわ
プロセス終了時にメモリマップの割り当てが解除されるとか、どうでもええわ
749デフォルトの名無しさん
2024/11/10(日) 21:48:10.22ID:xIqOi7JH >>747
Rustでは#[global_allocator]指定でカスタムなグローバルアロケータを使える
プログラム終了後にメモリリークが起きうる組み込み環境なら対応した自作のアロケータを実装してそのように指定して用いる
Rustでは#[global_allocator]指定でカスタムなグローバルアロケータを使える
プログラム終了後にメモリリークが起きうる組み込み環境なら対応した自作のアロケータを実装してそのように指定して用いる
750デフォルトの名無しさん
2024/11/10(日) 22:10:00.14ID:E3OFY7Tp >>729
May I talk about the ownership reproduction in the formal community web page?
May I talk about the ownership reproduction in the formal community web page?
751デフォルトの名無しさん
2024/11/10(日) 22:15:02.72ID:tFJCBt9m > プログラム終了後にメモリリークが起きうる組み込み環境
組み込みやったことないから知らんけど、そんな環境があんの?
組み込みやったことないから知らんけど、そんな環境があんの?
752デフォルトの名無しさん
2024/11/10(日) 22:27:44.25ID:tFJCBt9m https://github.com/rust-embedded/embedded-alloc
組み込みの典型的なコードってこのREADMEのサンプルコードみたいなんでいいのかね
プログラム(main)は終了しない
ヒープの「解放」処理も無い
合ってるよな?
自由に使える物理アドレス空間の一部を実行時アロケーションのために使用するってだけなら、使い終わりにやる「解放」の処理というのは何の話を言ってるんだ? って思ってたけど
そんなものはない、で合ってるのよな?
組み込みの典型的なコードってこのREADMEのサンプルコードみたいなんでいいのかね
プログラム(main)は終了しない
ヒープの「解放」処理も無い
合ってるよな?
自由に使える物理アドレス空間の一部を実行時アロケーションのために使用するってだけなら、使い終わりにやる「解放」の処理というのは何の話を言ってるんだ? って思ってたけど
そんなものはない、で合ってるのよな?
753デフォルトの名無しさん
2024/11/10(日) 22:31:44.37ID:tFJCBt9m >>750
search first
search first
754デフォルトの名無しさん
2024/11/10(日) 22:33:46.00ID:xIqOi7JH >>751
そういう特殊な環境を出してるのは俺ではないからね
すべてを明示的に解放しなくても我々が普通に使っている仮想メモリ利用では問題ないよという話と
組み込みだとそんな仮定はできなくてメモリリークしていく可能性があるよという話の両方が出ているから
後者でも対応したメモリアロケータを用意すれば対応できるよと解決策を示した
そういう特殊な環境を出してるのは俺ではないからね
すべてを明示的に解放しなくても我々が普通に使っている仮想メモリ利用では問題ないよという話と
組み込みだとそんな仮定はできなくてメモリリークしていく可能性があるよという話の両方が出ているから
後者でも対応したメモリアロケータを用意すれば対応できるよと解決策を示した
755デフォルトの名無しさん
2024/11/10(日) 22:41:08.35ID:E3OFY7Tp >>753
What do you mean? What I want to do is talking and having a discussion, not searching.
What do you mean? What I want to do is talking and having a discussion, not searching.
756デフォルトの名無しさん
2024/11/10(日) 22:48:01.15ID:tFJCBt9m757デフォルトの名無しさん
2024/11/10(日) 23:04:28.91ID:nOHdM7oG プログラムの最後に行儀よくbrkやsbrkでOSへメモリを解放しているアロケーターを見たことないな
OSにとってはどうでもいいことだからそんな行儀よさは不要なのだろう
ましてやアロケーターの内部でフラグなどをオフにするだけのfree()はプログラムの最後にいらない
実行中に再利用できるようにするかどうかが本質だろうね
OSにとってはどうでもいいことだからそんな行儀よさは不要なのだろう
ましてやアロケーターの内部でフラグなどをオフにするだけのfree()はプログラムの最後にいらない
実行中に再利用できるようにするかどうかが本質だろうね
758デフォルトの名無しさん
2024/11/10(日) 23:16:52.46ID:tFJCBt9m えーではリークの定義に関して直接的反論はなしということで
以下はすべて誤りであったということでよろしいですね
対戦ありがとうございました
>>593「freeせずにプログラムが終了したり落ちたりしてもメモリリークは起きない」
>>604「freeを忘れてもあるいはfreeせぬまま異常終了となってもその仕組みによりメモリリークは起きない」
>>631「そしてfree()せずにプログラムが終了してもメモリリークは起きない」
>>744「sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだがそれをしなくてもプログラム終了後にメモリリークは起きない」
>>746「普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きない」
「そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない」
以下はすべて誤りであったということでよろしいですね
対戦ありがとうございました
>>593「freeせずにプログラムが終了したり落ちたりしてもメモリリークは起きない」
>>604「freeを忘れてもあるいはfreeせぬまま異常終了となってもその仕組みによりメモリリークは起きない」
>>631「そしてfree()せずにプログラムが終了してもメモリリークは起きない」
>>744「sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだがそれをしなくてもプログラム終了後にメモリリークは起きない」
>>746「普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きない」
「そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない」
759デフォルトの名無しさん
2024/11/10(日) 23:26:36.38ID:mfp7bShs static mutは明らかにunsafeなわけだが
紙一重でunsafeとは言えないstatic変数のことを
警戒するかそれとも無駄な警備を極限まで捨てた合理主義の皇帝みたいに思うか
そういう対立はよくある
紙一重でunsafeとは言えないstatic変数のことを
警戒するかそれとも無駄な警備を極限まで捨てた合理主義の皇帝みたいに思うか
そういう対立はよくある
760デフォルトの名無しさん
2024/11/10(日) 23:33:02.28ID:xIqOi7JH プログラム終了後にメモリリークが起きるとすればOSが面倒をみてくれない環境だけだから
そういう環境では特殊な専用のメモリアロケータを用意するしかないだろうね
それならその自作のメモリアロケータをプログラム終了時に呼んで後始末させればメモリリークは防げる
Rustのstaticでヒープを持つ型を使っても最後まで使うメモリをBox::leak()で確保してもメモリリークは起こらないので安心していい
そういう環境では特殊な専用のメモリアロケータを用意するしかないだろうね
それならその自作のメモリアロケータをプログラム終了時に呼んで後始末させればメモリリークは防げる
Rustのstaticでヒープを持つ型を使っても最後まで使うメモリをBox::leak()で確保してもメモリリークは起こらないので安心していい
761デフォルトの名無しさん
2024/11/11(月) 00:17:42.59ID:4hLj+VPf Windows/Linux/macOSあたりなら
ファイルハンドルを閉じずにプログラム終了しても
OSが閉じてくれるから何の問題もない
的な主張?
ファイルハンドルを閉じずにプログラム終了しても
OSが閉じてくれるから何の問題もない
的な主張?
762デフォルトの名無しさん
2024/11/11(月) 00:20:13.67ID:VUm74iyn > プログラム終了後にメモリリークが起きるとすればOSが面倒をみてくれない環境
また実在しない環境の話し始めた
また実在しない環境の話し始めた
763デフォルトの名無しさん
2024/11/11(月) 00:28:54.94ID:VUm74iyn 間違いを認めなくても勝手にすりゃいいけど、そんなんじゃ誰とも意思疎通できないままだぞ
いくら長文を書き連ねても一緒
いくら長文を書き連ねても一緒
764デフォルトの名無しさん
2024/11/11(月) 00:56:28.26ID:If7GINDb 2種類ある
OSレベルのclose (例えばC言語でのシステムコールを呼ぶclose()) ならばOSが処理してくれるので異常終了含めてプログラム終了時にcloseしていなくても構わない
ただし各言語ライブラリのバッファリングなど他の機能を持つcloseはプログラム終了までに自分でcloseしないとその機能が完遂しない
一方でメモリ解放の場合
OSレベルのメモリ解放 (例えばbrk/sbrk) ならばOSがそのプログラムの仮想メモリ全体を無効にするのでプログラム終了時に解放していなくても構わない
メモリアロケーターライブラリのレベルのメモリ解放 (例えばfree()) もOSにとっては全く無関係な話なのでプログラム終了時に解放していなくても構わない
OSレベルのclose (例えばC言語でのシステムコールを呼ぶclose()) ならばOSが処理してくれるので異常終了含めてプログラム終了時にcloseしていなくても構わない
ただし各言語ライブラリのバッファリングなど他の機能を持つcloseはプログラム終了までに自分でcloseしないとその機能が完遂しない
一方でメモリ解放の場合
OSレベルのメモリ解放 (例えばbrk/sbrk) ならばOSがそのプログラムの仮想メモリ全体を無効にするのでプログラム終了時に解放していなくても構わない
メモリアロケーターライブラリのレベルのメモリ解放 (例えばfree()) もOSにとっては全く無関係な話なのでプログラム終了時に解放していなくても構わない
765デフォルトの名無しさん
2024/11/11(月) 01:04:17.69ID:S8QwpOFj 組み込みは詳しくないんだが今ってOSを使わない
組み込みでRustとか使うの?
Rustのターゲットって多分何らかのOSありきだよね
組み込みでRustとか使うの?
Rustのターゲットって多分何らかのOSありきだよね
766デフォルトの名無しさん
2024/11/11(月) 01:08:33.73ID:BN15+aOP >>765
語尾にオジを付けな
語尾にオジを付けな
767デフォルトの名無しさん
2024/11/11(月) 01:10:52.04ID:S8QwpOFj マ板久々なので意味がわからないww
768デフォルトの名無しさん
2024/11/11(月) 01:11:20.28ID:S8QwpOFj webassemblyもなんか微妙な感じだしもったいない
769デフォルトの名無しさん
2024/11/11(月) 01:13:05.34ID:BN15+aOP770デフォルトの名無しさん
2024/11/11(月) 01:16:21.72ID:S8QwpOFj すまんのうww
771デフォルトの名無しさん
2024/11/11(月) 01:27:50.38ID:If7GINDb >>765
OS無しにも対応している
Rustの標準ライブラリstd::はOS前提の機能も入っていてOS無しだと機能しないものもある
Rustの必須な言語機能はcore::ライブラリに部分に分離してまとめてあるので
ベアメタルな組み込みなどではstd::を使わない#![no-std]を指定してcore::を使う
core::では数値型や配列やスライスに文字列(str)およびその複合型が使えるがヒープは対象外なのでVecやStringは標準機能としては使えないといった違いがある
OS無しにも対応している
Rustの標準ライブラリstd::はOS前提の機能も入っていてOS無しだと機能しないものもある
Rustの必須な言語機能はcore::ライブラリに部分に分離してまとめてあるので
ベアメタルな組み込みなどではstd::を使わない#![no-std]を指定してcore::を使う
core::では数値型や配列やスライスに文字列(str)およびその複合型が使えるがヒープは対象外なのでVecやStringは標準機能としては使えないといった違いがある
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★3 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 偏差値35大臣「すぐに経済的威圧するところへの依存はリスク」 [834922174]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【朗報】高市、中国からの日本行き空路49万件キャンセルを達成🤩オーバーツーリズム対策の手腕が光る [359965264]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
