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

レス数が950を超えています。1000を超えると書き込みができなくなります。
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/
2023/12/04(月) 21:25:29.71ID:H6ggqIOp
>>863
Rustなら参照の共有はヒープを使わずスタックに置いてあるものに対しても安全に可能です
もちろん参照カウンタは必要ありません
ちなみにRustでC++のshared_ptrに相当するRc/Arcを必要とするのはもっと限定された状況で所有の共有が必要となる時のみです
2023/12/04(月) 21:32:42.16ID:KZyfgQnR
新たな間接参照でラップすることであたかも普通の変数を作るかのようにヒープに値を置ける
このパターンめちゃくちゃ有用なんだがなぜあらゆる本で紹介されてないんだ?
2023/12/04(月) 21:35:03.72ID:KZyfgQnR
コロンブスの卵だわ
誰もが思いつきそうで思いつかなかった
2023/12/04(月) 21:39:30.12ID:KZyfgQnR
>>866
まあその辺はさすがRust
2023/12/04(月) 21:41:03.87ID:ista3uD6
本気でRustに寄せるならunique_ptrの方がいいな
コンパイラが助けてくれないから死にそうだけど
とりあえず循環参照だけは気を付けてくれ

>>867
目的はちょっと違うけどPimplってイディオムがある
871デフォルトの名無しさん
垢版 |
2023/12/04(月) 21:54:58.33ID:85Eugi9n
継承じゃ無くて、包含して各メソッドをバトン渡しすれば良くね?
2023/12/04(月) 22:45:48.75ID:t1H4jiv7
>>867
他のやつも書いてるけどpimplな
20年前から知られている
ひたすらdelegate関数を書くのがだるい
使う側がshared_ptrで包むというルールのほうが楽
873デフォルトの名無しさん
垢版 |
2023/12/04(月) 23:15:56.57ID:o6jCQk0t
>>872
>ひたすらdelegate関数を書くのがだるい
書かねば良いのでは?
2023/12/04(月) 23:53:40.38ID:xybHpH7g
>>867
間接参照でいいならわざわざクラスでラップしなくてもshared_ptrそのものでいいように思うんだが
shared_ptr<HogeInternal>で扱うより
ラップしたHogeで扱ったほうがいいメリットって何?
875デフォルトの名無しさん
垢版 |
2023/12/05(火) 00:09:25.25ID:NEqb8LdH
mallocでメモリ確保するの気持ちイィ🥴
2023/12/05(火) 00:55:04.31ID:gtr9NjJz
>>872
20年前にこの概念が存在していたのか
当時はauto_ptrとかオレオレメモリ管理モジュールだったとは思うけど
2023/12/05(火) 00:58:42.15ID:gtr9NjJz
>>872
ライブラリとして定期したい場合はshared_ptrで常に包むルールを強制するのも難しいとかかな
2023/12/05(火) 04:45:21.81ID:55rynLOP
delegate指定子欲しいよな。
クラスor変数でまとめて指定できればなお良し。
2023/12/05(火) 05:43:53.62ID:DR8rm2oC
それってRustのDeref?
880デフォルトの名無しさん
垢版 |
2023/12/05(火) 08:01:23.94ID:HiCWBikd
std::byteを使ってみた結果
危険な計算ができるのがC/C++を使う理由という結論になった
2023/12/05(火) 08:50:09.72ID:iiJ5Z2H1
一人で何役やってるの?
2023/12/05(火) 09:49:41.30ID:Akhn3hwz
>>881
数えてみろよ
2023/12/05(火) 10:22:23.63ID:0dgzhl7w
>>877
Factoryメソッド経由でしかインスタンス化できないようにするとかして常にshared_ptrやunique_ptrで返すようにすればいいのでは?
2023/12/05(火) 10:50:40.33ID:cS2yZHjP
>>879
delegateに欲しいのはあくまでAdaptorの実装を簡単にする機能。

参照外しとかして型を変えるのはNG。
2023/12/05(火) 11:56:35.63ID:pNurA5HJ
Rustのdelegate!のようなことがC++ではまだ出来ないということか
汚いマクロ書けばできそうだけど綺麗に書くにはReflection待ちなのかな
2023/12/05(火) 13:26:22.00ID:iiJ5Z2H1
>>882
こういうキチガイ対策にワッチョイ必要かもな
2023/12/05(火) 13:34:36.87ID:gtr9NjJz
>>882
きっしょw
2023/12/05(火) 14:18:15.60ID:DR8rm2oC
>>884
スマートポインタなのだから
Derefにより自動的に参照できれば十分だろ
2023/12/05(火) 14:23:46.88ID:4UYj/sQ8
ワッチョイ立てたってところで結局また次世代言語スレと同じ流れになってRustスレに帰ってくるんだろ
2023/12/05(火) 14:24:46.44ID:4UYj/sQ8
×立てたってところで
○立てたところで
2023/12/05(火) 14:31:18.82ID:1iJo44eg
Adaptorにだけ執拗にこだわるオジもアレだか
Adaptorも知らずにDerefを勧めるオジは論外
2023/12/05(火) 14:58:30.60ID:gtr9NjJz
>>883
ユーザーに返す型では流石に気持ち悪いと思うなあ
C++難し過ぎるだろ
選択肢が多過ぎる
かといって安全でもない
もうRust使わせてくれ
2023/12/05(火) 15:21:39.57ID:MywljXTh
>>892
別の理由でfactory使うときはどのみちshard_ptrかunique_ptrにせざるを得ない
(生ポインタはありえない)
だからそこを気持ち悪いと言っても仕方ない
2023/12/05(火) 15:51:48.29ID:Nvodex4n
>>892
Rustでもそこは同じだと思うよ
ライブラリからBoxやArcが返されるものもあればそれらをラップした型が返されるものもある
シンプルなケースなら前者の方が圧倒的に使いやすい
内包する型のネストが深い場合などで便利メソッドを提供するなら後者ってイメージ
要はラップするだけの付加価値があるかどうか
895デフォルトの名無しさん
垢版 |
2023/12/05(火) 15:52:25.13ID:QJai9ytv
>>854
馬鹿は平気で二重に解放したりする
全然気にしないから馬鹿なんだけどね
2023/12/05(火) 16:00:15.02ID:8v2tQb+c
>>854
いやいやいやいやw
2023/12/05(火) 16:26:52.90ID:sq6EbAl6
リファレンスカウンタ方式のGCを基本にするんならGC言語でいいんじゃねってならない?
2023/12/05(火) 16:45:36.42ID:iiJ5Z2H1
>>889
えー
2023/12/05(火) 16:47:29.78ID:MywljXTh
ならない
リアルタイム系アプリでGCは困る
2023/12/05(火) 17:17:38.64ID:CoP1YuvK
循環参照で発生するリークを検出するか放置するか
あるいは循環参照を回避するか
それが問題だ
2023/12/05(火) 17:29:27.24ID:W0r7TCUZ
>>899
マークスウィープの話をしてないぞ
リファレンスカウンタ方式のGCすら使えないというならshared_ptrも同様に使えないということになる
2023/12/05(火) 17:59:20.81ID:ugZXhcp8
手動メモリ管理のできないGC言語は高コストをかけて循環参照を回収せざるをえない
手動メモリ管理のできるC++/Rustは循環参照を避けることができて低コスト

その話とは別にshared_ptrやRc/Arcは参照カウンタによるコストがかかる
そのため複数所有者を使わざるを得ない場合に限定して用いる
2023/12/05(火) 18:13:07.15ID:Ppu4uIXE
>>902
Weak Reference等を使って循環参照を手動で避ける方法が用意されてるかどうかは手動メモリ管理かどうかとは全く関係ないよ
2023/12/05(火) 18:43:14.63ID:gtr9NjJz
>>894
気持ち的にはラップしたいかなあ
2023/12/05(火) 19:04:48.69ID:gtr9NjJz
全銀システム障害「詳細設計書見落とし」でオーバーフローの痛恨、再発防止なるか
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08680/

Rustを使えばいいじゃない
2023/12/05(火) 19:13:25.15ID:gquaqYbt
IBMだったらJavaだったのに
907デフォルトの名無しさん
垢版 |
2023/12/05(火) 19:18:25.05ID:800y2Su3
積極的にC++を使いたがる人ってC++のどこに魅力を感じているんだ
2023/12/05(火) 19:24:31.25ID:GrTJwyK/
Cとの互換性
909デフォルトの名無しさん
垢版 |
2023/12/05(火) 19:32:43.32ID:4rw/VL0P
>>897
問題はGC言語は *常に* GC機能ありなところ。
2023/12/05(火) 19:40:36.09ID:iiJ5Z2H1
>>907
オブジェクト指向w
911デフォルトの名無しさん
垢版 |
2023/12/05(火) 20:04:51.38ID:3vhS3QGH
リファレンスカウンター気にするくらい速度を求めるなら、RAIIすら嫌だとはならんのかな
mallocはプログラムの最初に一回呼ぶ以外は許されない
912デフォルトの名無しさん
垢版 |
2023/12/05(火) 20:31:30.51ID:GM9Glwep
>>907
組み込み系でオブジェクトやりたい人
あと意図的に悪意あるコードを仕込む人とか。
913デフォルトの名無しさん
垢版 |
2023/12/05(火) 21:15:38.20ID:HiCWBikd
やりたいことが出来るのが一番の理由
アンリミテッドが魅力
2023/12/05(火) 21:36:14.43ID:9fH1d+k3
参照カウントて結構コストあったよな……と探したら解説見つけた。
yamasa.hatenablog.jp/entry/2021/01/29/012525

昔は並列処理と相性悪いと言われていたけど、今はどうかね?
2023/12/05(火) 21:36:19.50ID:ckmQfDX3
++C Unsafety Unlimited C++
2023/12/05(火) 21:43:08.45ID:tZxAn7Rl
>>909
GC言語でもunsafeで手動管理とかできるよ
Rustと同じで基本がsafeだからC++をsafeにしていくよりもずっと簡単で問題が起きにくいアプローチ
2023/12/05(火) 21:59:57.96ID:puqODfvy
>>902
>そのため複数所有者を使わざるを得ない場合に限定して用いる
複数所有者を使わざるを得ない状況かどうかを確実に見分けるのはそれなりに難しい
Rustの場合はコンパイル通らないから無駄にRc/Arcを違うことはあっても逆はないので安全
C++は逆もある
>>853が「めちゃくちゃ安全になる」と言ってる理由もその辺にあるのでは
2023/12/05(火) 22:10:46.45ID:vNAfxFS3
>>911
RAII自体はコストゼロ
RAIIで解放されるスタック上の値の型にデストラクタがある時にその実行コストがかかる
そしてヒープ領域を所有していればヒープ解放コストがかかる
何度もヒープ確保解放を繰り返すよりはなるべく最初に確保するのはもちろん正しい
スタック領域で済ませられるならさらに望ましい
2023/12/05(火) 22:57:00.41ID:iiJ5Z2H1
全部独り言だったりしてw
2023/12/06(水) 01:20:30.01ID:N0N71GtG
メモリに展開するのにオーバーフローしてもエラーを通知しないの?
https://japan.zdnet.com/article/35212258/

言語はCらしいけどどういうプログラムなんだろう
まじでmallocしてそこにmemcpyしてるだけなんじゃないか
対策はRustで書き直せ
2023/12/06(水) 01:23:15.09ID:N0N71GtG
たとえクソレガシーだったとしても書き込むアドレスの範囲が想定してるものかのチェックは入れるべきだろう
どうせオフセットも手計算だろうし
922デフォルトの名無しさん
垢版 |
2023/12/06(水) 01:40:45.31ID:MT5mgeUa
>>916
>>909
>GC言語でもunsafeで手動管理とかできるよ

どの言語?具体名あげてくれ。
2023/12/06(水) 01:58:21.86ID:+XLnMsko
[gc unsafe] [🔍]
2023/12/06(水) 09:15:07.04ID:oM0gjrfW
>>867-868
循環参照は?
925デフォルトの名無しさん
垢版 |
2023/12/06(水) 09:17:14.31ID:oM0gjrfW
>>867
>あらゆる本で紹介されてない

a)全ての本で紹介されていない
b)紹介された本がひとつもない

どっちの意味?念のため確認
2023/12/06(水) 09:18:07.12ID:oM0gjrfW
>925 補足
a)全ての本で紹介されていない (紹介されてる本は少なくとも一つ以上ある)
2023/12/06(水) 09:20:39.56ID:oM0gjrfW
>>868
思い付いている人は大勢居る

>>865
>C++で極力Rustっぽく書く

いやいや Rust 以前から Rust 無関係に C++ で普通に C++ っぽく描いた結果でしょ
きみ承認欲求強過ぎるね
2023/12/06(水) 10:53:51.94ID:CNnXy5JV
>>922
メジャーなとこで言えばC#とかSwiftとか
2023/12/06(水) 11:45:54.12ID:oM0gjrfW
>>905
やっぱりNATテーブル不良で再起動したら治るルーターじゃん
2023/12/06(水) 12:09:32.50ID:4VSkBLs6
>>929
頭大丈夫か?
2023/12/06(水) 12:31:44.18ID:3kI3ay52
型推論の是非を問いたい
書くのは楽かもしれないが読みにくくね?
型の重複記述は省きたいがまったく型がわからなくなると理解が難しくなる
読みやすさを優先すべきだと思うがどうだろう
IDEやエディタのサポートでカバーされるという考え方もあるが、カーソル合わせないとわからないしな
2023/12/06(水) 12:44:38.03ID:lEEu+DT0
>>931
ややこしい型の手書きとか効率悪化の元だから駄目。

せいぜいIDEに型のコメントを自動生成させるくらいまでだな。手動は更新されなくなってバグの温床になる。
933デフォルトの名無しさん
垢版 |
2023/12/06(水) 12:46:06.06ID:MT5mgeUa
>>931
けっこう同意。
変数初期化ではリテラルでの場合だけ型推論利用して、そうでなければ型書いちゃうことも多い。
934デフォルトの名無しさん
垢版 |
2023/12/06(水) 12:51:11.58ID:MT5mgeUa
>>932
>手動は更新されなくなってバグの温床になる。

型変わったらコンパイル通らないし、型明示がバグの温床になるってのは無い。
修正の手間が増えるってのはわかる。
2023/12/06(水) 12:54:09.75ID:B4jpx9xe
複雑な型名を知る必要がない場合も多い
例えばRustなら関数の引数型も返り型でも具体的な型名を書かずに
impl Trait名 と使う機能のトレイト名だけを指定したり
2023/12/06(水) 12:56:26.38ID:lEEu+DT0
>>934
c++はスライシングあるからエラーにならない例外もある。
レアケースだけど。
937デフォルトの名無しさん
垢版 |
2023/12/06(水) 13:09:40.96ID:6EzLMFr7
同じ情報を二重に書くのはプログラマなら普通疑問に思う
2023/12/06(水) 13:12:47.35ID:N0N71GtG
>>924
コピー時はweak_refで渡すので良いかと思うのだが
2023/12/06(水) 13:14:02.81ID:N0N71GtG
>>925
普通に考えてaじゃないの?
なんで紹介とか出てくるんだ?
2023/12/06(水) 13:17:03.16ID:3kI3ay52
>>937
ある程度の重複さによってミスを早期発見できる効果があるから一概にそうはいえないぞ
2023/12/06(水) 13:31:08.88ID:UHi6Tpqq
俺のプログラムにバグがあるのは
俺がまだ本気出してないだけだから
2023/12/06(水) 13:38:13.20ID:+XLnMsko
どれだけスレが進行しても客観的な基準が示されず
主観バトルを発生させ続け
留まるところを知らない概念

可読性
2023/12/06(水) 13:40:26.85ID:uGBP6FLN
>>938
いやそれだとshared_ptrの意味ないから
shared_ptr使う限りは本質的には解決は難しい
それは生でshared_ptr使う場合も同じ
get_weakというメソッドでweak_refでラップして返すメソッドを提供するとかだろう
2023/12/06(水) 13:44:37.37ID:uGBP6FLN
全銀のシステムこの規模で低レイヤーのメモリ操作しまくるのにC使ってるのマジで狂気としか思えないな
コードレベルのユニットテストもないのだろうし
絶対こういうこと起きるやん
945デフォルトの名無しさん
垢版 |
2023/12/06(水) 13:55:39.00ID:6EzLMFr7
>>940
保守できなくなるから必ず避けるべき
2023/12/06(水) 14:04:56.53ID:3kI3ay52
>>945
プログラミング言語自体、ある程度の冗長性があるようにデザインされている
たからこそコンパイルエラーという現象が起こる
そもそもテストを書くという行為が重複した作業なのだけどやるだろ?
仕様変更したら書き直しなのは仕方ない
2023/12/06(水) 14:06:40.52ID:ts/cnrJA
Cであることは関係なくね?
データ形式の共有に失敗すればどこでも起こりそう
記事だけだとよく分からんけどAAABBBをABABABって誤認した感じでしょ
2023/12/06(水) 14:10:35.44ID:4S+GIU/C
ABAP
2023/12/06(水) 14:11:26.67ID:6EzLMFr7
>>946
>プログラミング言語自体、ある程度の冗長性があるようにデザインされている
それは妥協の産物で悪だよ

>たからこそコンパイルエラーという現象が起こる
冗長性がない言語があったとしてコンパイルエラーは起こるし意味がある

>そもそもテストを書くという行為が重複した作業なのだけどやるだろ?
>仕様変更したら書き直しなのは仕方ない

最初に型名が正しいと確認されたら型推論に任せるべきです
2023/12/06(水) 14:17:11.63ID:N0N71GtG
>>947
どこを読んだらそうなるんだ?
2023/12/06(水) 14:41:23.05ID:oM0gjrfW
>>945
>保守できなくなるから必ず避けるべき

保守する気がなくなるから必ず避けるべき
ならわかる
2023/12/06(水) 14:44:32.97ID:uGBP6FLN
>>947
なんも分かってなくて草
あの記事だけで普通は全部理解できるぞ
2023/12/06(水) 14:52:19.97ID:3kI3ay52
>>949
> 最初に型名が正しいと確認されたら型推論に任せるべきです

その最初の確認ってどうすんのさ?
まったく字面では現れない場合があるよね
もともとはその場合の話
2023/12/06(水) 15:01:15.76ID:ts/cnrJA
>>952
記事から全部理解できたならたぶん別の記事だと思う
2023/12/06(水) 15:07:10.91ID:N0N71GtG
>>954
正確にはスライド
普通にわかる
2023/12/06(水) 15:12:14.26ID:6EzLMFr7
>>953
まぁそうだね
>>932で私の言いたいことは書かれてたや
2023/12/06(水) 15:22:00.69ID:aoO2XCof
全銀のやつは記事に書いてることはわかるがめちゃくそ疑問だらけ

なんで生成時にサイズチェックしないのか
なんで生成されたテーブルをチェックしてないのか
なんで生成されたテーブル使った試験をしてないのか

一般企業でもなかなかお目にかかれないひどい内容だがそれを金融系のしかも全銀がやっちゃうってのが信じられないわ
958デフォルトの名無しさん
垢版 |
2023/12/06(水) 15:26:41.21ID:MT5mgeUa
>>944
同感
959デフォルトの名無しさん
垢版 |
2023/12/06(水) 15:33:52.57ID:MT5mgeUa
型推論よりインテリセンスとか補完がうざい。
こっちの入力リズムに合わないとイラっと来ることある。
960デフォルトの名無しさん
垢版 |
2023/12/06(水) 16:16:19.10ID:oM0gjrfW
>>957
同感
2023/12/06(水) 16:17:28.30ID:oM0gjrfW
>>959
判る
入力enterで違う単語になってたら殺意を覚える
2023/12/06(水) 18:22:40.40ID:SQhb0To1
Pimplが説明してるある本がないか立ち読みしたのだがあった
最近出たC++ソフトウェア設計という本にモロに書いてあった
こんな本いつの間に出てたんだ?
モロに俺がドヤ顔したパターンじゃねえか...
この本内容もめちゃくちゃ良いぞ
2023/12/06(水) 18:31:32.46ID:6EzLMFr7
pimplってGoFになかったっけ?
2023/12/06(水) 18:37:31.41ID:+XLnMsko
ヘッダファイルの変更のせいで再コンパイルされるC++特有の問題に対処するのが主目的のpimplがなんでGoFにあると思ったんですか?
965デフォルトの名無しさん
垢版 |
2023/12/06(水) 18:54:10.35ID:MT5mgeUa
>>962
pimpl、10年前の本「C++のためのAPIデザイン」(2012年)にも載ってるぞ。
2023/12/06(水) 18:55:40.21ID:SQhb0To1
まあPimplの主張はコンパイルサイズを固定するとか
内部を隠蔽することが主目的っぽいね
この本ではImplにunique_ptrを使ってコピー時にmoveする実装になってる
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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