結局C++とRustってどっちが良いの? 8traits

■ このスレッドは過去ログ倉庫に格納されています
2023/10/28(土) 13:45:00.38ID:fh9BWjjr
「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/
715デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:19:45.20ID:7/k6/GSg
>>701
それどころかプロセスを完全に終了させても解放されないリソースが残ることがある
OSを再起動してやっと治る
こんなもんOSのバグとしか言いようがない
716デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:21:22.84ID:7/k6/GSg
>>702
あるね
>>699 こそやったこと無い香具師だと感じる
717デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:24:14.02ID:7/k6/GSg
>>703
Windowsにforkがあれば良かったと思うことは何度かある
718デフォルトの名無しさん
垢版 |
2023/11/27(月) 09:26:12.71ID:7/k6/GSg
ああでも
>>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で描いたコルーチンで比較するべきだろ
2023/11/27(月) 10:19:10.91ID:bfNyVWtl
プロセスを分けて独立したメモリ空間の単位で障害を切り離して耐障害性を高めるのは昔からよく使われる方法だけどこれはスレッドやコルーチンでは代用できない

並行性を高める目的ならコルーチン+スレッドプールが最も効率が良い
C++やRustはまだまだ使いにくいけどGoやC#やSwiftのように使いやすいAPIが用意されれば誰もが当たり前のように使うようになる
2023/11/27(月) 13:17:02.15ID:y1vsdTcE
>>717
ある程度時間がかかる処理を並行で動かすという面でこれほど楽で使いやすいものはないしね
windowsへの移植性を上げるためにはforkを捨てなきゃならんのはかなり厳しい
2023/11/27(月) 13:22:19.90ID:y1vsdTcE
windowsくんェ
https://draftcode.github.io/2011/12/29/145918.html
2023/11/27(月) 13:27:11.60ID:UqO8a829
fork移植されてると思うけどそういう話ではなく?
2023/11/27(月) 13:40:29.77ID:y1vsdTcE
>>723
pythonじゃ使えないぞ
2023/11/27(月) 14:04:14.09ID:l+s92lQ4
遅くともcygwinとかで、なんちゃってforkは実装されてるけど、コレジャナイ感は付きまとうんだよな(個人の感想です
2023/11/27(月) 14:10:54.29ID:O2rw1r7K
execなしのforkなんて時代錯誤もいいところ
いまだに使ってるやついんのか?
さっさと引退するのが世のために
2023/11/27(月) 14:17:35.21ID:zZXu+dmb
RubyもNotImplementedError
Perlはエミュレーションしてるがすでに非推奨レベル
2023/11/27(月) 14:21:41.56ID:+D1aTXqp
こんどはforkを取り囲んでフェルマータするターンか
2023/11/27(月) 15:12:24.83ID:qB4qrVrI
forkは同じページを(書き換えるまで)共有できるのが売りだと思うけどwin版は最初からコピーするのか
そんな実装でfork爆弾作れるの?
2023/11/27(月) 15:12:35.28ID:l+s92lQ4
ま、雑談だからな おもしろければどうでもおっけー
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キャッシュ効果と領域確保解放コスト無しで高速な)スタック領域の活用がスマポではできない
732デフォルトの名無しさん
垢版 |
2023/11/27(月) 15:50:29.33ID:UqO8a829
スタック領域をスマートポインタで指す必要はあるの?
2023/11/27(月) 15:57:04.75ID:l+s92lQ4
先々で、うっかりfreeするような書き方してしまったときにコンパイルエラーで止まってほしい
実体としては生ポだけど、チェック用の何かにラップされてる…そういうスマポ
2023/11/27(月) 17:16:07.46ID:FscsMJtl
いつものように誰かが書いてた受け売りで中身は理解してないんだろ
少し突っ込まれたら表面的なことを繰り返す壊れたレコードになる
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
実装すれば良いのでは?
2023/11/27(月) 19:12:23.49ID:MloD+hDC
>>731
スタック領域は勝手に解放されますが
2023/11/27(月) 19:23:48.42ID:VTBvXWTh
Rustはヒープ領域だけでなくスタック領域にまで所有権やムーブや参照の概念を拡張したことから
C++よりスタック領域の活用で効率的になってる話ではないか
2023/11/27(月) 19:41:50.12ID:4LX/kS4x
>>738
コードで示してよ
C++の
2023/11/27(月) 19:55:41.13ID:XLFtaca7
>>738
単に「何でもスタックに積む」というだけでは?
ヒープはVec Box使わないと確保できないんじゃなかったっけ。
741デフォルトの名無しさん
垢版 |
2023/11/27(月) 19:57:13.46ID:ceTrdy2T
C++は書くのがしんどい
Rustもしんどいけど、生成AIに書かせたコードもコンパイルとテスト通ればメモリリークの心配なく使えるので気持ちは楽
2023/11/28(火) 03:07:58.34ID:iuwbNdCf
Boxってヒープのメモリどうやって管理してんの?スコープ?
743デフォルトの名無しさん
垢版 |
2023/11/28(火) 06:19:45.83ID:fb4KLmhh
>>734
ほんそれ
同じ香具師なんだろうバレバレ
2023/11/28(火) 07:21:41.08ID:p7m/jx+j
>>742
unique ptrみたいな感じじゃない?
2023/11/28(火) 07:38:03.63ID:OE19BKGq
>>736
自分なりには考えてみてるんだけどね

ベーシックな車輪くらい、削り出せなきゃいけない
ダサいので試してるってのは他言はしないけどね ここくらいだ
2023/11/28(火) 08:32:49.65ID:t7+ip2Xg
>>738
また嘘言ってる
Rustはヒープ領域だけでなくスタック領域にまで所有権やムーブや参照の概念を拡張したことから
C++よりスタック領域の活用で非効率的になってる

>>741
お前は死んだ方が良い
2023/11/28(火) 08:34:53.09ID:4GFkN+H+
スタック使うってカーネルで使えるん?
2023/11/28(火) 09:04:02.54ID:uB2ZO1/C
Rustの所有権チェックって、(コンパイル時にコストを寄せてるから)実行時はゼロコストじゃないん

へたくそに書いたら効率が下がる(たいてい実装効率が上がった犠牲)のは、C/C++も同じ
2023/11/28(火) 10:10:56.04ID:pC50QOa+
技術的選択というのは最終的には必ずトレードオフになるので
ある選択のプラス面だけしか見ない/考えない/認識できないやつは何やらせてもダメ
750デフォルトの名無しさん
垢版 |
2023/11/28(火) 12:14:38.37ID:0HFLSmnD
新人やお前らの前任の調子いいだけの奴がコンパイル通したコードで、rustとc++のどっちが安心できるかってことよ。
2023/11/28(火) 12:37:00.84ID:zgX3htu8
c++に自動変数専用参照とかあるといいんだけどなぁ。
自動変数にあるスマートポインタは参照渡ししたい。
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
と暇人が申しております
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); //次のスタックフレームに渡すのも合法
}
2023/11/28(火) 15:32:05.10ID:PhTWlmVC
>>755
あ、最後は
foo(pptr);
だわ。
2023/11/28(火) 20:15:20.15ID:QlCOA+Xa
メモリがスタックにあるかヒープにあるかはリンカのアドレスマップと連携すればわかる
つまり欲しいなら自作すればいいのでは
2023/11/28(火) 21:08:43.42ID:zgX3htu8
>>757
え?リンクでこねこにすればshared_ptrのカウンタを増減させなくて済むようになるんかね?

そういう最適化しているリンカとかあるの?
2023/11/28(火) 21:40:34.18ID:2tolr/zk
さっぱり意味が分からんのだけど
もしかしてshared_ptr&&&なる存在に参照されたshared_ptr<T>だけはスタック上にTを保持する何者かに化けろと要求している??
2023/11/28(火) 21:52:40.46ID:5v5wYsOr
何がやりたいのかさっぱりわからん
2023/11/28(火) 23:17:43.17ID:Y2Vu8rdK
クラスは必ずnewしないといけないと思いこんでいた昔のワイみたいな勘違いしてそう
2023/11/28(火) 23:30:04.45ID:p7m/jx+j
>>759
全然違う。
shared_ptr&&&なる存在には自動変数にあるshared_ptrだけしか代入できなくて、左辺値とかヒープにあるインスタンスを代入しようとするとコンパイル時にエラーになるだけだよ。

>>760
呼び出し元の方にあるスタックフレームに保存されている自動変数は、スタックフレームのLIFOを破壊しない限り存在を保証できる。そういう自動変数を呼び出し先から安全に参照したいだけだよ。
2023/11/28(火) 23:38:15.09ID:2tolr/zk
>>762
自動変数にあるshared_ptrは左辺値だが
2023/11/28(火) 23:41:06.97ID:2tolr/zk
そもそも参照に対して行えるのは代入ではなく初期化だし
2023/11/28(火) 23:43:48.38ID:QlCOA+Xa
無知ばっかりでここまで話が通じないと思わなんだ
スタックやヒープの開始アドレスがどこから始まるとか気にしたことないの?
rustの悪いとこ透けて見えたわ
2023/11/28(火) 23:55:41.04ID:xnaKz8pj
Rustならそんな複雑なことする必要もなく
Rustの方が優れている
ライフタイムさえ満たせば参照先がヒープかスタックか関係なく同一コードでその参照を安全に返す関数などを書くことができる
2023/11/29(水) 00:18:45.75ID:UMPQWy8o
言い訳ばかり達者で見苦しいスレだこと
768デフォルトの名無しさん
垢版 |
2023/11/29(水) 01:18:06.77ID:w45cg+MW
>>765
>>751
>>755 と話繋がってないけど。
スタックやヒープの始まりは >>755 のコードでも >>751 の要件でもわからんやん。
2023/11/29(水) 02:07:48.15ID:0GsI2ATG
どっかで身に覚えがある流れだなと思った
たぶん要件定義の時点でなんかおかしいよ
https://mevius.5ch.net/test/read.cgi/tech/1542002113/504-523
2023/11/29(水) 03:16:09.69ID:0jw/VZcC
いまいちメリットがわからない
ヒープのオブジェクトなら渡す前に呼び出し側でチェックすべきなのではないのか
2023/11/29(水) 03:26:29.12ID:nEUPDdEn
バカ強制矯正共生強請言語Rust
2023/11/29(水) 03:32:20.62ID:I6OxsG4L
>>757
どのOSも汎用的に判別できる方法はない
(組み込みは除く)
2023/11/29(水) 06:13:09.34ID:n75oaT1g
Rust推してる香具師はスタックとヒープの違いも判ってないのか
2023/11/29(水) 06:15:55.34ID:n75oaT1g
>>768 ←これはひどい
2023/11/29(水) 07:33:14.16ID:Oshr4ESo
関数の定義で、shared ptr の参照を安全に受け付ける仮引数の定義方法とかあるの?
効率化のためにインスタンスのコピーは無しの方向で。
776デフォルトの名無しさん
垢版 |
2023/11/29(水) 08:59:38.65ID:w45cg+MW
>>773
スタックの頭知りたかったらコマンドライン引数のアドレス取れば?ヒープの頭知りたかったら最初にsbrk(0)すれば?
2023/11/29(水) 09:22:10.12ID:cEfAMy5j
>>765
それでコンパイル時にエラーにできるのかい?
2023/11/29(水) 09:24:24.67ID:cEfAMy5j
>>775
「安全に受け付ける」の定義は?
特に何をもって「安全」と言ってるのか
779デフォルトの名無しさん
垢版 |
2023/11/29(水) 09:29:15.22ID:w45cg+MW
>>776
これだと実行時だわ、コンパイル時にはわからんわスマン。
ってか何でコンパイル時にスタックやヒープの先頭アドレス知りたいのかわからん。
リンクしないでなんてわかりようも無いし。
2023/11/29(水) 10:51:01.40ID:I6OxsG4L
rustはヒープとスタックを言語的に区別してライフタイムをトラックしてるだろ
それが欲しいならrust使えで終わり
c++では汎用的には無理
そういう要望は昔からある
2023/11/29(水) 11:14:58.09ID:wOoUvEHR
>>778
そりゃ、関数を実行している間は参照先が無効にならないことですな。
2023/11/29(水) 11:26:21.99ID:JCtBk62y
そもそもスタックに参照カウンタ必要か?
関数に対するスタックはプロセスに対するグローバル領域とライフタイムの考え方は同じ。
関数を抜けるまではスタックは有効だし、その関数以降に呼んだ関数が呼出元の関数を抜けた後も握り続ける状況は発生しえない
(別スレッドに共有したりヒープにCopy/Moveしない限りは)からshared_ptrにする必要がないと思うが。
つまり、

T x; // スタック
shared_ptr<T> x; // ヒープ

で型が異なるから、強引にCopy/Moveしなけりゃコンパイルエラーで検出できるし問題は起きない。
2023/11/29(水) 11:39:18.60ID:I6OxsG4L
>>755 はいまいちよくわからんが、ポインタを受け取る関数側でスタックかヒープを判別したいんだろ
かつてそれを解決するため手法としてregion based memory managementが開発された
rustのライフタイム管理の源流
2023/11/29(水) 11:46:11.39ID:wioHB1Dg
>>773
Rustでsafeにヒープが使われるのはBoxとVecおよびそれらが組み込まれた型のみなのでヒープかスタックか明確に区別がつく

>>780
参照になった時点でヒープかスタックかの区別なくライフタイムのみで安全に扱えるところがRustの勝因かな
スタック領域を指す参照についても関数から返してよい参照と返してはいけない参照の区別がライフタイムでなされる
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); //次のスタックフレームに渡すのも合法
}
2023/11/29(水) 13:05:45.44ID:I6OxsG4L
>>785
shared_ptr<T>を使うから意味が不明なんだよ
Tが置かれる場所がスタックかヒープかなんだろ?
2023/11/29(水) 13:32:40.14ID:SVBOdyHv
void foo(T& p){}
void foo(shared_ptr<T>& p){static_assert}
2023/11/29(水) 13:33:08.54ID:pBsavzeJ
>>768
なんやこれ
頭がおかしくなりそう
789デフォルトの名無しさん
垢版 |
2023/11/29(水) 13:37:19.41ID:qKmTtpoR
>>773
スタックとヒープの違いが分かってなくても使えるなんて、なんて素晴らしい言語なんだ
2023/11/29(水) 13:52:43.41ID:pBsavzeJ
もういいよ
議論するレベルになってない
引っ掻き回したいだけだろ
この話題終わり
ゴミだから
2023/11/29(水) 14:48:01.22ID:wOoUvEHR
>>786
違う。
「shared ptr」の置かれている場所がスタックかヒープか。この場合だとTはヒープ。
>>785はとりあえず「shared ptrが」自動変数にある場合だけエラーにならないのを想定。
2023/11/29(水) 15:04:52.17ID:0jw/VZcC
はい終わり終わり
2023/11/29(水) 15:22:50.48ID:I6OxsG4L
>>791
shared_ptrの参照カウントの操作を省きたいならshared_ptrの参照渡すか生ポインタ渡せばいいだろ
それかrustにしろ
2023/11/29(水) 15:29:56.33ID:0GsI2ATG
「lvalueよりさらに限定された値カテゴリを作って、それだけを指せる参照を導入したい」という欲求

もしかして: ライフタイム
2023/11/29(水) 15:56:42.98ID:8C/SUjDF
ヒープを排除したいのは参照してる間にfree/deleteされるのを気にしてるからかな
Rustだとライフタイムというよりborrow checkで解決してる問題
2023/11/29(水) 16:40:54.30ID:wioHB1Dg
>>795
そこでborrow checkerが具体的にしていることがライフタイムの妥当性(やミュータビリティの妥当性など)
2023/11/29(水) 18:22:15.98ID:g4z1paMZ
>>781
ポイントしてる先がどうなってるかは関係なくてshared_ptr自体がスタック上で生きていれば「shared_ptrへの参照」は無効にならないということを「安全」だと言ってるという理解でいい?
2023/11/29(水) 20:22:08.97ID:/iUfnYRG
>795 >797
そういう話。
RustだとRc<T>の参照をbollow checkerで(たしか)安全に管理できたけど、c++はshared ptr の参照なんて気にもしないで破棄するから、せめて自動変数に置くことを強制しできればちょっとだけ安全に効率化できるのにな、ぐらいの話。
2023/11/29(水) 20:54:47.61ID:8C/SUjDF
RustのRcもC++のshared_ptrも参照でやり取りするより
Rc本体をclone(C++なら値渡しでコピー)した方が使いやすいと思う

中身じゃなく本体を参照渡しするなら参照カウンタ増えないしRc(shared_ptr)使う意味がなさそう
shared_ptrは元データが破棄されてもコピーが生き残ることに意味があるわけで
この例でshared_ptrを使われると話がややこしくなる
2023/11/29(水) 22:26:34.34ID:gjeaJk+d
>>798
なるほどそういうことならAST的なものに対してカスタムルールを定義できる静的解析ツールみたいなもので頑張ればチェックはできそう

ただポイント先が途中で変化しても安全と言えるかどうか微妙
Arc/Rcはownerが複数いる場合はポイント先が変更されないことも保証されてる
2023/11/30(木) 12:27:38.75ID:MXha9GzH
ライフタイムチェックが今のRustと同じレベルになるのは早くてもC++32以降なので過度に期待せず気長にお待ち下さい。
2023/11/30(木) 13:55:26.66ID:7CM8sx7O
>>791
その理屈だと
>>784 も頓珍漢なこと言ってる
2023/11/30(木) 13:57:58.44ID:7CM8sx7O
要するに
>>782
で話は終わってる
2023/11/30(木) 14:51:08.28ID:JOtYuMwa
的はずれなことを書いてる自覚がないとはな
複オジ(>>784)のほうが多少自覚してるだけマシかもしれんぞ
2023/11/30(木) 15:21:08.01ID:D7FKv4Y4
>>800
自作でやるならかなり大変で、自作言語作るのと工数変わらないかも。
それならRust使ったほうが楽かね。
2023/11/30(木) 16:35:34.05ID:5k4SwxyG
いや服おじは論外
2023/12/01(金) 20:56:33.56ID:2VykkaiV
>>801
サポートするとC++ではなくなってしまう
別言語を同居させたようになり混乱が増す
2023/12/02(土) 00:20:14.03ID:qhhzthLD
C++はもうテンプレートで道を一度踏み外してる外道だから今更だよ
2023/12/02(土) 21:13:09.29ID:Lt6EdYBh
Javaからプログラム始めたからC++の静的ポリモーフィズムやるconceptの制約がわかりにくすぎて使いこなせん
C++20のconceptを使いこなせてる猛者さん、果たしてスレにおるのかね
810デフォルトの名無しさん
垢版 |
2023/12/02(土) 21:29:52.21ID:ojltmATj
C++で継承をやろうとするのが間違いなんだよね😇
テンプレートはゴミ!
ゴミなんです!
2023/12/02(土) 22:01:16.75ID:PDmr7t8h
C++使ってるけど継承もテンプレートも使ってないな
812デフォルトの名無しさん
垢版 |
2023/12/03(日) 11:30:00.35ID:QTewqrs7



2023/12/03(日) 13:55:04.97ID:vkjAQods
最近新プロジェクトでC++書かなきゃいけなくてRust使いたがったが
外部システムやライブラリとの絡みで仕方なくC++を使うことになったのだけど

std::shared_ptr
std::weak_ptr
std::move
ムーブ代入演算子
ムーブコンストラクタ
enum class
constexpr(主に設定値のテーブル初期化などに使う)

新しい要素だとマジでこれだけしか使ってなかったよ
継承なしテンプレートなし
外部ライブラリとしてonetbbとminimalloc使ってるだけ
これだけでもそこそこモダンなプログラミングができる
あと足りないのはライフタイムだけかな
C++にそれがきたらRustはいらないけど果たしていつになるのか
2023/12/03(日) 14:26:32.44ID:KItL/kTG
shared_ptr使ったならテンプレートなしは言いすぎかな
自作テンプレートなしってところか
テンプレートはライブラリとか裏方向けの要素だからアプリ開発ではあまり使わないかも
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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