「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」
っていう雑談スレ。
・C/C++ <=> Rust いまさら聞けない移行質問なども適当にどぞ
・レスバはじめんのは勝手だけど、面白いこと・へぇなこと書いたヤツが優勝
・マな話は、マのスレもご活用ください↓
前スレ: 結局C++とRustってどっちが良いの? 7traits
http://mevius.5ch.net/test/read.cgi/tech/1693451813/
関連スレ(マ板): Google&Microsoft「セキュリティバグの70%はC/C++のメモリ管理ミス。Rustにする」
https://medaka.5ch.net/test/read.cgi/prog/1619943288/
結局C++とRustってどっちが良いの? 8traits
■ このスレッドは過去ログ倉庫に格納されています
2023/10/28(土) 13:45:00.38ID:fh9BWjjr
701デフォルトの名無しさん
2023/11/26(日) 22:37:51.44ID:06WEnIxy 俺が遭遇したのは2件で、どちらもOSの不具合という結論だよ
MSのナレッジに残ってるかもしれないがどっちもプロセスを終了するしか解決策が示されなかった
>>699
こういう理不尽に遭遇して回避策が示されたなら大仕事でもやらざるを得ないと思うけどね
別に難しいって程でもないし
MSのナレッジに残ってるかもしれないがどっちもプロセスを終了するしか解決策が示されなかった
>>699
こういう理不尽に遭遇して回避策が示されたなら大仕事でもやらざるを得ないと思うけどね
別に難しいって程でもないし
702デフォルトの名無しさん
2023/11/26(日) 22:48:32.77ID:06WEnIxy そういや別件でOSが設定しているタイムアウト値を待てない場合も別プロセスにして回避した事がある
この板って年寄りばかりだろうしWindowsのプログラミング長年やってれば何度かそういう事に遭遇するんじゃないの
この板って年寄りばかりだろうしWindowsのプログラミング長年やってれば何度かそういう事に遭遇するんじゃないの
703デフォルトの名無しさん
2023/11/26(日) 23:01:37.86ID:iMOX0Yuj あのね、年寄りが真面目に答えてやるとOSの観点から言うと
windowsとLinuxじゃプロセスの考え方が結構違ってて
Linuxの場合、バックグラウンドプロセスっていうのは普通に使われまくってるの
いわゆるプロセスのクローンだから扱いが楽
シェルから作れるし
一方windowsではexeなんでクソ重い上に扱いが面倒
データ共有やプロセス間通信も一苦労だ
だからwindowsではLinuxっぽいバックグラウンド処理はスレッドを使う
windowsにおいてスレッドの方が軽い
一方Linuxではスレッドもプロセスも本質的に同じ
(カーネルの構造体thread_structはプロセス生成の時も使う)
よってプログラミングモデルがだいぶ違うため
どうすべきか?はかなり違う
以上がwindowsでもLinuxでも並行処理を書いてきた俺の感想
windowsとLinuxじゃプロセスの考え方が結構違ってて
Linuxの場合、バックグラウンドプロセスっていうのは普通に使われまくってるの
いわゆるプロセスのクローンだから扱いが楽
シェルから作れるし
一方windowsではexeなんでクソ重い上に扱いが面倒
データ共有やプロセス間通信も一苦労だ
だからwindowsではLinuxっぽいバックグラウンド処理はスレッドを使う
windowsにおいてスレッドの方が軽い
一方Linuxではスレッドもプロセスも本質的に同じ
(カーネルの構造体thread_structはプロセス生成の時も使う)
よってプログラミングモデルがだいぶ違うため
どうすべきか?はかなり違う
以上がwindowsでもLinuxでも並行処理を書いてきた俺の感想
704デフォルトの名無しさん
2023/11/26(日) 23:12:09.99ID:dlQxZ4PC Windowsはプロセスもスレッドも、互換性チェックみたいのが重厚らしく超高コスト
さらに、セキュリティソフトが走ってるのが当たり前の世界なので、ファイルハンドルも高コスト
なんでもWSL2でやったほうが軽い? らしい
てことで、コルーチンはいいぞw
さらに、セキュリティソフトが走ってるのが当たり前の世界なので、ファイルハンドルも高コスト
なんでもWSL2でやったほうが軽い? らしい
てことで、コルーチンはいいぞw
705デフォルトの名無しさん
2023/11/26(日) 23:30:18.11ID:EFSUb3PR Rustの東京を使えばデフォルトでCPUのコアスレッド数をフル活用してコルーチンを何万も同時に動かせますものね
706デフォルトの名無しさん
2023/11/27(月) 00:37:45.36ID:ggQuSpTQ Elixir は、10万もの小プロセスを起動できる
Go の並行処理も、mattn の本に書いてあるけど、
C で、100スレッドを起動したら、
CPU 使用率が高く、12秒も掛かったが、
Goで100 goroutine を起動したら、
6スレッドしか起動せず、9秒で済んだ
Goの方が、CPUコアを効率的に使える
Go の並行処理も、mattn の本に書いてあるけど、
C で、100スレッドを起動したら、
CPU 使用率が高く、12秒も掛かったが、
Goで100 goroutine を起動したら、
6スレッドしか起動せず、9秒で済んだ
Goの方が、CPUコアを効率的に使える
707706
2023/11/27(月) 00:48:36.74ID:ggQuSpTQ とにかく、スレッドを起動したらダメ!
CPU コアや時間の大半が、起動処理に使われるから
CPU コアや時間の大半が、起動処理に使われるから
708デフォルトの名無しさん
2023/11/27(月) 00:59:58.17ID:zZXu+dmb とはいえコルーチンって使い所が難しいのよ
流行りそうで流行らないのがその理由
結局「本当の並列性が必要ないようなすぐ終わる処理を大量にする」ユースケースにしか使えないから
こういう処理ってあまりないことに気がつく
まず真の並列性が必要となる数値計算では使えない
処理の中でブロックするとダメなのでその判断も難しい
よって普通の言語では使うのが難しい
流行りそうで流行らないのがその理由
結局「本当の並列性が必要ないようなすぐ終わる処理を大量にする」ユースケースにしか使えないから
こういう処理ってあまりないことに気がつく
まず真の並列性が必要となる数値計算では使えない
処理の中でブロックするとダメなのでその判断も難しい
よって普通の言語では使うのが難しい
709デフォルトの名無しさん
2023/11/27(月) 01:36:12.87ID:O2rw1r7K710デフォルトの名無しさん
2023/11/27(月) 01:38:37.07ID:AHLzaHDv >>706
>Goの方が、CPUコアを効率的に使える
そう主張したかったら根拠を示さないとね
例えば逆の根拠として
Go各のgoroutineは別々の各々のスタック領域を必要とするけど
Rustはスタックレスなコルーチンだから必要とせずその分だけ効率的だね
>Goの方が、CPUコアを効率的に使える
そう主張したかったら根拠を示さないとね
例えば逆の根拠として
Go各のgoroutineは別々の各々のスタック領域を必要とするけど
Rustはスタックレスなコルーチンだから必要とせずその分だけ効率的だね
711デフォルトの名無しさん
2023/11/27(月) 01:45:48.38ID:zZXu+dmb >>707
普通はスレッドプール使うやろ
普通はスレッドプール使うやろ
712デフォルトの名無しさん
2023/11/27(月) 06:31:05.54ID:klBkI3Ol おれの作成したソフトは起動時に64個のスレッドを立ち上げているが常にサクサクだ
713デフォルトの名無しさん
2023/11/27(月) 07:50:36.80ID:h6EdzCL7 >>712
言語は何?
言語は何?
714デフォルトの名無しさん
2023/11/27(月) 07:54:36.67ID:klBkI3Ol cppは光速
715デフォルトの名無しさん
2023/11/27(月) 09:19:45.20ID:7/k6/GSg717デフォルトの名無しさん
2023/11/27(月) 09:24:14.02ID:7/k6/GSg >>703
Windowsにforkがあれば良かったと思うことは何度かある
Windowsにforkがあれば良かったと思うことは何度かある
718デフォルトの名無しさん
2023/11/27(月) 09:26:12.71ID:7/k6/GSg ああでも
>>703
>一方windowsではexeなんでクソ重い上に扱いが面倒
>データ共有やプロセス間通信も一苦労だ
>だからwindowsではLinuxっぽいバックグラウンド処理はスレッドを使う
ここは完全に間違ってるよ
>>703
>一方windowsではexeなんでクソ重い上に扱いが面倒
>データ共有やプロセス間通信も一苦労だ
>だからwindowsではLinuxっぽいバックグラウンド処理はスレッドを使う
ここは完全に間違ってるよ
719デフォルトの名無しさん
2023/11/27(月) 09:30:39.99ID:7/k6/GSg >>706
>C で、100スレッドを起動したら、
>CPU 使用率が高く、12秒も掛かったが、
>
>Goで100 goroutine を起動したら、
>6スレッドしか起動せず、9秒で済んだ
可笑しな理屈だな
スレッド数で比較するならgoでも100スレッド使って比較するか
Cの方でスレッド数増やさないCで描いたコルーチンで比較するべきだろ
>C で、100スレッドを起動したら、
>CPU 使用率が高く、12秒も掛かったが、
>
>Goで100 goroutine を起動したら、
>6スレッドしか起動せず、9秒で済んだ
可笑しな理屈だな
スレッド数で比較するならgoでも100スレッド使って比較するか
Cの方でスレッド数増やさないCで描いたコルーチンで比較するべきだろ
720デフォルトの名無しさん
2023/11/27(月) 10:19:10.91ID:bfNyVWtl プロセスを分けて独立したメモリ空間の単位で障害を切り離して耐障害性を高めるのは昔からよく使われる方法だけどこれはスレッドやコルーチンでは代用できない
並行性を高める目的ならコルーチン+スレッドプールが最も効率が良い
C++やRustはまだまだ使いにくいけどGoやC#やSwiftのように使いやすいAPIが用意されれば誰もが当たり前のように使うようになる
並行性を高める目的ならコルーチン+スレッドプールが最も効率が良い
C++やRustはまだまだ使いにくいけどGoやC#やSwiftのように使いやすいAPIが用意されれば誰もが当たり前のように使うようになる
721デフォルトの名無しさん
2023/11/27(月) 13:17:02.15ID:y1vsdTcE722デフォルトの名無しさん
2023/11/27(月) 13:22:19.90ID:y1vsdTcE723デフォルトの名無しさん
2023/11/27(月) 13:27:11.60ID:UqO8a829 fork移植されてると思うけどそういう話ではなく?
724デフォルトの名無しさん
2023/11/27(月) 13:40:29.77ID:y1vsdTcE >>723
pythonじゃ使えないぞ
pythonじゃ使えないぞ
725デフォルトの名無しさん
2023/11/27(月) 14:04:14.09ID:l+s92lQ4 遅くともcygwinとかで、なんちゃってforkは実装されてるけど、コレジャナイ感は付きまとうんだよな(個人の感想です
726デフォルトの名無しさん
2023/11/27(月) 14:10:54.29ID:O2rw1r7K execなしのforkなんて時代錯誤もいいところ
いまだに使ってるやついんのか?
さっさと引退するのが世のために
いまだに使ってるやついんのか?
さっさと引退するのが世のために
727デフォルトの名無しさん
2023/11/27(月) 14:17:35.21ID:zZXu+dmb RubyもNotImplementedError
Perlはエミュレーションしてるがすでに非推奨レベル
Perlはエミュレーションしてるがすでに非推奨レベル
728デフォルトの名無しさん
2023/11/27(月) 14:21:41.56ID:+D1aTXqp こんどはforkを取り囲んでフェルマータするターンか
729デフォルトの名無しさん
2023/11/27(月) 15:12:24.83ID:qB4qrVrI forkは同じページを(書き換えるまで)共有できるのが売りだと思うけどwin版は最初からコピーするのか
そんな実装でfork爆弾作れるの?
そんな実装でfork爆弾作れるの?
730デフォルトの名無しさん
2023/11/27(月) 15:12:35.28ID:l+s92lQ4 ま、雑談だからな おもしろければどうでもおっけー
731デフォルトの名無しさん
2023/11/27(月) 15:37:56.10ID:+D1aTXqp オジジジジジw
https://medaka.5ch.net/test/read.cgi/prog/1619943288/667
667: 仕様書無しさん 2023/11/24(金) 01:57:39.09
>>665
C++のスマポは機能が弱すぎてできないことが多すぎる
例えばヒープ領域しか指せないから
(L1キャッシュ効果と領域確保解放コスト無しで高速な)スタック領域の活用がスマポではできない
https://medaka.5ch.net/test/read.cgi/prog/1619943288/667
667: 仕様書無しさん 2023/11/24(金) 01:57:39.09
>>665
C++のスマポは機能が弱すぎてできないことが多すぎる
例えばヒープ領域しか指せないから
(L1キャッシュ効果と領域確保解放コスト無しで高速な)スタック領域の活用がスマポではできない
732デフォルトの名無しさん
2023/11/27(月) 15:50:29.33ID:UqO8a829 スタック領域をスマートポインタで指す必要はあるの?
733デフォルトの名無しさん
2023/11/27(月) 15:57:04.75ID:l+s92lQ4 先々で、うっかりfreeするような書き方してしまったときにコンパイルエラーで止まってほしい
実体としては生ポだけど、チェック用の何かにラップされてる…そういうスマポ
実体としては生ポだけど、チェック用の何かにラップされてる…そういうスマポ
734デフォルトの名無しさん
2023/11/27(月) 17:16:07.46ID:FscsMJtl いつものように誰かが書いてた受け売りで中身は理解してないんだろ
少し突っ込まれたら表面的なことを繰り返す壊れたレコードになる
少し突っ込まれたら表面的なことを繰り返す壊れたレコードになる
735デフォルトの名無しさん
2023/11/27(月) 17:19:29.35ID:ZLucLoet www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf
736デフォルトの名無しさん
2023/11/27(月) 19:00:17.85ID:UqO8a829 >>733
実装すれば良いのでは?
実装すれば良いのでは?
737デフォルトの名無しさん
2023/11/27(月) 19:12:23.49ID:MloD+hDC >>731
スタック領域は勝手に解放されますが
スタック領域は勝手に解放されますが
738デフォルトの名無しさん
2023/11/27(月) 19:23:48.42ID:VTBvXWTh Rustはヒープ領域だけでなくスタック領域にまで所有権やムーブや参照の概念を拡張したことから
C++よりスタック領域の活用で効率的になってる話ではないか
C++よりスタック領域の活用で効率的になってる話ではないか
739デフォルトの名無しさん
2023/11/27(月) 19:41:50.12ID:4LX/kS4x740デフォルトの名無しさん
2023/11/27(月) 19:55:41.13ID:XLFtaca7741デフォルトの名無しさん
2023/11/27(月) 19:57:13.46ID:ceTrdy2T C++は書くのがしんどい
Rustもしんどいけど、生成AIに書かせたコードもコンパイルとテスト通ればメモリリークの心配なく使えるので気持ちは楽
Rustもしんどいけど、生成AIに書かせたコードもコンパイルとテスト通ればメモリリークの心配なく使えるので気持ちは楽
742デフォルトの名無しさん
2023/11/28(火) 03:07:58.34ID:iuwbNdCf Boxってヒープのメモリどうやって管理してんの?スコープ?
743デフォルトの名無しさん
2023/11/28(火) 06:19:45.83ID:fb4KLmhh744デフォルトの名無しさん
2023/11/28(火) 07:21:41.08ID:p7m/jx+j >>742
unique ptrみたいな感じじゃない?
unique ptrみたいな感じじゃない?
745デフォルトの名無しさん
2023/11/28(火) 07:38:03.63ID:OE19BKGq746デフォルトの名無しさん
2023/11/28(火) 08:32:49.65ID:t7+ip2Xg747デフォルトの名無しさん
2023/11/28(火) 08:34:53.09ID:4GFkN+H+ スタック使うってカーネルで使えるん?
748デフォルトの名無しさん
2023/11/28(火) 09:04:02.54ID:uB2ZO1/C Rustの所有権チェックって、(コンパイル時にコストを寄せてるから)実行時はゼロコストじゃないん
へたくそに書いたら効率が下がる(たいてい実装効率が上がった犠牲)のは、C/C++も同じ
へたくそに書いたら効率が下がる(たいてい実装効率が上がった犠牲)のは、C/C++も同じ
749デフォルトの名無しさん
2023/11/28(火) 10:10:56.04ID:pC50QOa+ 技術的選択というのは最終的には必ずトレードオフになるので
ある選択のプラス面だけしか見ない/考えない/認識できないやつは何やらせてもダメ
ある選択のプラス面だけしか見ない/考えない/認識できないやつは何やらせてもダメ
750デフォルトの名無しさん
2023/11/28(火) 12:14:38.37ID:0HFLSmnD 新人やお前らの前任の調子いいだけの奴がコンパイル通したコードで、rustとc++のどっちが安心できるかってことよ。
751デフォルトの名無しさん
2023/11/28(火) 12:37:00.84ID:zgX3htu8 c++に自動変数専用参照とかあるといいんだけどなぁ。
自動変数にあるスマートポインタは参照渡ししたい。
自動変数にあるスマートポインタは参照渡ししたい。
752デフォルトの名無しさん
2023/11/28(火) 14:34:16.09ID:5v5wYsOr 今更だけどNonNullクソ便利だな
753デフォルトの名無しさん
2023/11/28(火) 14:49:32.02ID:tbacT9e+ >>751
イマイチ分からんのだがコードで書ける?
イマイチ分からんのだがコードで書ける?
754デフォルトの名無しさん
2023/11/28(火) 15:14:43.92ID:zjrE05Ar >>632
と暇人が申しております
と暇人が申しております
755デフォルトの名無しさん
2023/11/28(火) 15:30:47.32ID:PhTWlmVC >>753
void foo(shared_ptr<T>&&& p)
でshared_ptr&&&が自動変数専用参照だとすると、
void main() {
shared_ptr<T> ptr;
foo(ptr); //スタックにあると合法
shared_ptr<shared_ptr<T>> pptr;
foo(*pptr); //ヒープにあるとエラー
shared_ptr<T>&&& pp = ptr;
foo(*pptr); //次のスタックフレームに渡すのも合法
}
void foo(shared_ptr<T>&&& p)
でshared_ptr&&&が自動変数専用参照だとすると、
void main() {
shared_ptr<T> ptr;
foo(ptr); //スタックにあると合法
shared_ptr<shared_ptr<T>> pptr;
foo(*pptr); //ヒープにあるとエラー
shared_ptr<T>&&& pp = ptr;
foo(*pptr); //次のスタックフレームに渡すのも合法
}
756デフォルトの名無しさん
2023/11/28(火) 15:32:05.10ID:PhTWlmVC757デフォルトの名無しさん
2023/11/28(火) 20:15:20.15ID:QlCOA+Xa メモリがスタックにあるかヒープにあるかはリンカのアドレスマップと連携すればわかる
つまり欲しいなら自作すればいいのでは
つまり欲しいなら自作すればいいのでは
758デフォルトの名無しさん
2023/11/28(火) 21:08:43.42ID:zgX3htu8759デフォルトの名無しさん
2023/11/28(火) 21:40:34.18ID:2tolr/zk さっぱり意味が分からんのだけど
もしかしてshared_ptr&&&なる存在に参照されたshared_ptr<T>だけはスタック上にTを保持する何者かに化けろと要求している??
もしかしてshared_ptr&&&なる存在に参照されたshared_ptr<T>だけはスタック上にTを保持する何者かに化けろと要求している??
760デフォルトの名無しさん
2023/11/28(火) 21:52:40.46ID:5v5wYsOr 何がやりたいのかさっぱりわからん
761デフォルトの名無しさん
2023/11/28(火) 23:17:43.17ID:Y2Vu8rdK クラスは必ずnewしないといけないと思いこんでいた昔のワイみたいな勘違いしてそう
762デフォルトの名無しさん
2023/11/28(火) 23:30:04.45ID:p7m/jx+j763デフォルトの名無しさん
2023/11/28(火) 23:38:15.09ID:2tolr/zk >>762
自動変数にあるshared_ptrは左辺値だが
自動変数にあるshared_ptrは左辺値だが
764デフォルトの名無しさん
2023/11/28(火) 23:41:06.97ID:2tolr/zk そもそも参照に対して行えるのは代入ではなく初期化だし
765デフォルトの名無しさん
2023/11/28(火) 23:43:48.38ID:QlCOA+Xa 無知ばっかりでここまで話が通じないと思わなんだ
スタックやヒープの開始アドレスがどこから始まるとか気にしたことないの?
rustの悪いとこ透けて見えたわ
スタックやヒープの開始アドレスがどこから始まるとか気にしたことないの?
rustの悪いとこ透けて見えたわ
766デフォルトの名無しさん
2023/11/28(火) 23:55:41.04ID:xnaKz8pj Rustならそんな複雑なことする必要もなく
Rustの方が優れている
ライフタイムさえ満たせば参照先がヒープかスタックか関係なく同一コードでその参照を安全に返す関数などを書くことができる
Rustの方が優れている
ライフタイムさえ満たせば参照先がヒープかスタックか関係なく同一コードでその参照を安全に返す関数などを書くことができる
767デフォルトの名無しさん
2023/11/29(水) 00:18:45.75ID:UMPQWy8o 言い訳ばかり達者で見苦しいスレだこと
768デフォルトの名無しさん
2023/11/29(水) 01:18:06.77ID:w45cg+MW769デフォルトの名無しさん
2023/11/29(水) 02:07:48.15ID:0GsI2ATG どっかで身に覚えがある流れだなと思った
たぶん要件定義の時点でなんかおかしいよ
https://mevius.5ch.net/test/read.cgi/tech/1542002113/504-523
たぶん要件定義の時点でなんかおかしいよ
https://mevius.5ch.net/test/read.cgi/tech/1542002113/504-523
770デフォルトの名無しさん
2023/11/29(水) 03:16:09.69ID:0jw/VZcC いまいちメリットがわからない
ヒープのオブジェクトなら渡す前に呼び出し側でチェックすべきなのではないのか
ヒープのオブジェクトなら渡す前に呼び出し側でチェックすべきなのではないのか
771デフォルトの名無しさん
2023/11/29(水) 03:26:29.12ID:nEUPDdEn バカ強制矯正共生強請言語Rust
772デフォルトの名無しさん
2023/11/29(水) 03:32:20.62ID:I6OxsG4L773デフォルトの名無しさん
2023/11/29(水) 06:13:09.34ID:n75oaT1g Rust推してる香具師はスタックとヒープの違いも判ってないのか
774デフォルトの名無しさん
2023/11/29(水) 06:15:55.34ID:n75oaT1g >>768 ←これはひどい
775デフォルトの名無しさん
2023/11/29(水) 07:33:14.16ID:Oshr4ESo 関数の定義で、shared ptr の参照を安全に受け付ける仮引数の定義方法とかあるの?
効率化のためにインスタンスのコピーは無しの方向で。
効率化のためにインスタンスのコピーは無しの方向で。
776デフォルトの名無しさん
2023/11/29(水) 08:59:38.65ID:w45cg+MW >>773
スタックの頭知りたかったらコマンドライン引数のアドレス取れば?ヒープの頭知りたかったら最初にsbrk(0)すれば?
スタックの頭知りたかったらコマンドライン引数のアドレス取れば?ヒープの頭知りたかったら最初にsbrk(0)すれば?
777デフォルトの名無しさん
2023/11/29(水) 09:22:10.12ID:cEfAMy5j >>765
それでコンパイル時にエラーにできるのかい?
それでコンパイル時にエラーにできるのかい?
778デフォルトの名無しさん
2023/11/29(水) 09:24:24.67ID:cEfAMy5j779デフォルトの名無しさん
2023/11/29(水) 09:29:15.22ID:w45cg+MW780デフォルトの名無しさん
2023/11/29(水) 10:51:01.40ID:I6OxsG4L rustはヒープとスタックを言語的に区別してライフタイムをトラックしてるだろ
それが欲しいならrust使えで終わり
c++では汎用的には無理
そういう要望は昔からある
それが欲しいならrust使えで終わり
c++では汎用的には無理
そういう要望は昔からある
781デフォルトの名無しさん
2023/11/29(水) 11:14:58.09ID:wOoUvEHR >>778
そりゃ、関数を実行している間は参照先が無効にならないことですな。
そりゃ、関数を実行している間は参照先が無効にならないことですな。
782デフォルトの名無しさん
2023/11/29(水) 11:26:21.99ID:JCtBk62y そもそもスタックに参照カウンタ必要か?
関数に対するスタックはプロセスに対するグローバル領域とライフタイムの考え方は同じ。
関数を抜けるまではスタックは有効だし、その関数以降に呼んだ関数が呼出元の関数を抜けた後も握り続ける状況は発生しえない
(別スレッドに共有したりヒープにCopy/Moveしない限りは)からshared_ptrにする必要がないと思うが。
つまり、
T x; // スタック
shared_ptr<T> x; // ヒープ
で型が異なるから、強引にCopy/Moveしなけりゃコンパイルエラーで検出できるし問題は起きない。
関数に対するスタックはプロセスに対するグローバル領域とライフタイムの考え方は同じ。
関数を抜けるまではスタックは有効だし、その関数以降に呼んだ関数が呼出元の関数を抜けた後も握り続ける状況は発生しえない
(別スレッドに共有したりヒープにCopy/Moveしない限りは)からshared_ptrにする必要がないと思うが。
つまり、
T x; // スタック
shared_ptr<T> x; // ヒープ
で型が異なるから、強引にCopy/Moveしなけりゃコンパイルエラーで検出できるし問題は起きない。
783デフォルトの名無しさん
2023/11/29(水) 11:39:18.60ID:I6OxsG4L >>755 はいまいちよくわからんが、ポインタを受け取る関数側でスタックかヒープを判別したいんだろ
かつてそれを解決するため手法としてregion based memory managementが開発された
rustのライフタイム管理の源流
かつてそれを解決するため手法としてregion based memory managementが開発された
rustのライフタイム管理の源流
784デフォルトの名無しさん
2023/11/29(水) 11:46:11.39ID:wioHB1Dg785デフォルトの名無しさん
2023/11/29(水) 12:57:35.03ID:/iUfnYRG 例が微妙だな。直しておくか。
void foo(shared_ptr<T>&&& p)
でshared_ptr&&&が自動変数専用参照だとすると、
shared_ptr<T> bar()
void main() {
shared_ptr<T> ptr;
foo(ptr); //自動変数だと合法
foo(bar()); //自動変数でないとエラー
}
void foo(shared_ptr<T>&&& p) {
baz(p); //次のスタックフレームに渡すのも合法
}
void foo(shared_ptr<T>&&& p)
でshared_ptr&&&が自動変数専用参照だとすると、
shared_ptr<T> bar()
void main() {
shared_ptr<T> ptr;
foo(ptr); //自動変数だと合法
foo(bar()); //自動変数でないとエラー
}
void foo(shared_ptr<T>&&& p) {
baz(p); //次のスタックフレームに渡すのも合法
}
786デフォルトの名無しさん
2023/11/29(水) 13:05:45.44ID:I6OxsG4L787デフォルトの名無しさん
2023/11/29(水) 13:32:40.14ID:SVBOdyHv void foo(T& p){}
void foo(shared_ptr<T>& p){static_assert}
void foo(shared_ptr<T>& p){static_assert}
788デフォルトの名無しさん
2023/11/29(水) 13:33:08.54ID:pBsavzeJ789デフォルトの名無しさん
2023/11/29(水) 13:37:19.41ID:qKmTtpoR >>773
スタックとヒープの違いが分かってなくても使えるなんて、なんて素晴らしい言語なんだ
スタックとヒープの違いが分かってなくても使えるなんて、なんて素晴らしい言語なんだ
790デフォルトの名無しさん
2023/11/29(水) 13:52:43.41ID:pBsavzeJ もういいよ
議論するレベルになってない
引っ掻き回したいだけだろ
この話題終わり
ゴミだから
議論するレベルになってない
引っ掻き回したいだけだろ
この話題終わり
ゴミだから
791デフォルトの名無しさん
2023/11/29(水) 14:48:01.22ID:wOoUvEHR792デフォルトの名無しさん
2023/11/29(水) 15:04:52.17ID:0jw/VZcC はい終わり終わり
793デフォルトの名無しさん
2023/11/29(水) 15:22:50.48ID:I6OxsG4L794デフォルトの名無しさん
2023/11/29(水) 15:29:56.33ID:0GsI2ATG 「lvalueよりさらに限定された値カテゴリを作って、それだけを指せる参照を導入したい」という欲求
もしかして: ライフタイム
もしかして: ライフタイム
795デフォルトの名無しさん
2023/11/29(水) 15:56:42.98ID:8C/SUjDF ヒープを排除したいのは参照してる間にfree/deleteされるのを気にしてるからかな
Rustだとライフタイムというよりborrow checkで解決してる問題
Rustだとライフタイムというよりborrow checkで解決してる問題
796デフォルトの名無しさん
2023/11/29(水) 16:40:54.30ID:wioHB1Dg >>795
そこでborrow checkerが具体的にしていることがライフタイムの妥当性(やミュータビリティの妥当性など)
そこでborrow checkerが具体的にしていることがライフタイムの妥当性(やミュータビリティの妥当性など)
797デフォルトの名無しさん
2023/11/29(水) 18:22:15.98ID:g4z1paMZ >>781
ポイントしてる先がどうなってるかは関係なくてshared_ptr自体がスタック上で生きていれば「shared_ptrへの参照」は無効にならないということを「安全」だと言ってるという理解でいい?
ポイントしてる先がどうなってるかは関係なくてshared_ptr自体がスタック上で生きていれば「shared_ptrへの参照」は無効にならないということを「安全」だと言ってるという理解でいい?
798デフォルトの名無しさん
2023/11/29(水) 20:22:08.97ID:/iUfnYRG >795 >797
そういう話。
RustだとRc<T>の参照をbollow checkerで(たしか)安全に管理できたけど、c++はshared ptr の参照なんて気にもしないで破棄するから、せめて自動変数に置くことを強制しできればちょっとだけ安全に効率化できるのにな、ぐらいの話。
そういう話。
RustだとRc<T>の参照をbollow checkerで(たしか)安全に管理できたけど、c++はshared ptr の参照なんて気にもしないで破棄するから、せめて自動変数に置くことを強制しできればちょっとだけ安全に効率化できるのにな、ぐらいの話。
799デフォルトの名無しさん
2023/11/29(水) 20:54:47.61ID:8C/SUjDF RustのRcもC++のshared_ptrも参照でやり取りするより
Rc本体をclone(C++なら値渡しでコピー)した方が使いやすいと思う
中身じゃなく本体を参照渡しするなら参照カウンタ増えないしRc(shared_ptr)使う意味がなさそう
shared_ptrは元データが破棄されてもコピーが生き残ることに意味があるわけで
この例でshared_ptrを使われると話がややこしくなる
Rc本体をclone(C++なら値渡しでコピー)した方が使いやすいと思う
中身じゃなく本体を参照渡しするなら参照カウンタ増えないしRc(shared_ptr)使う意味がなさそう
shared_ptrは元データが破棄されてもコピーが生き残ることに意味があるわけで
この例でshared_ptrを使われると話がややこしくなる
800デフォルトの名無しさん
2023/11/29(水) 22:26:34.34ID:gjeaJk+d >>798
なるほどそういうことならAST的なものに対してカスタムルールを定義できる静的解析ツールみたいなもので頑張ればチェックはできそう
ただポイント先が途中で変化しても安全と言えるかどうか微妙
Arc/Rcはownerが複数いる場合はポイント先が変更されないことも保証されてる
なるほどそういうことならAST的なものに対してカスタムルールを定義できる静的解析ツールみたいなもので頑張ればチェックはできそう
ただポイント先が途中で変化しても安全と言えるかどうか微妙
Arc/Rcはownerが複数いる場合はポイント先が変更されないことも保証されてる
801デフォルトの名無しさん
2023/11/30(木) 12:27:38.75ID:MXha9GzH ライフタイムチェックが今のRustと同じレベルになるのは早くてもC++32以降なので過度に期待せず気長にお待ち下さい。
■ このスレッドは過去ログ倉庫に格納されています
