X



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

■ このスレッドは過去ログ倉庫に格納されています
2023/04/02(日) 00:42:57.53ID:W9/nq+tL
「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」

っていうスレ。

前スレ: 結局C++とRustってどっちが良いの?
https://mevius.5ch.net/test/read.cgi/tech/1677286186/
2023/04/22(土) 18:42:18.67ID:+yUQZ3bR
>>365
Rcはジャンルも機能も動作も利用方法も全く異なりその話は誰もしていないよ
あなたが>>359で言った、
> 参照カウントが2以上ならエラーでいい
> 実行時エラーなら難しくない
> コンパイル時が難しいだけ
は、Rcとは全く異なる挙動でありRcとは無関係

あなたが言っている挙動「参照カウントが2以上ならエラー」は「sIngle reader or single writer」
そしてRefCellはその上位の「multiple readers or single writer」
つまりRefCellはもっと便利であり利用面での上位互換
2023/04/22(土) 18:45:43.59ID:pFB+K5t4
話が専門的になってきているけれども、「メモリー関連バグ」はバグの一部に
過ぎず、それが完全に防げたとしてもバグが入り込む余地はたくさんある。
例えば、JSやJava、C#、BASIC、Pythonなどの言語はメモリー関連バグは
入り込まないが、バグはいくらでも入り込む。
2023/04/22(土) 18:51:49.24ID:iD47eBZH
Javaはぬるぽぬるぽいってたけどねえ いまさらだけど、あれなんだったんだろう (nullptrは使ってます
2023/04/22(土) 19:01:05.60ID:pFB+K5t4
>>367
追加として、Ruby、PHP、Perl なども同様。
メモリー関連バグは入らないが、論理バグはいくらでも入り込む。
だから、ネットショッピングサイトをこれらの言語で作っても、
データ漏洩や、データ消失(顧客情報の間違った削除など)、
インターフェースのバグ、買いたいものが買えない、別人のアカウントで
買った事になってしまう、あるいは、セキュリティーホールなどは、
入り込む余地はいくらでもある。
15 番の人が購入しているのに、16番の人を購入したことにしてしまったりとか。
または、ボタンを一回押したのに、2回購入したことになってしまったとか。
キャンセルボタンを押しても動作しないとか。
または、キャンセルすると、14番の人の購入がキャンセルしてしまったりとか。
そういうのは基本的に論理バグであり、メモリー関連バグとは別に発生しうる。
2023/04/22(土) 19:24:40.58ID:2MwGVm8+
>>367
GC言語を含めた多くの言語で発生する普遍的なバグがデータ競合
データ競合は様々なものがあってマルチスレッドでは当然発生するだけでなく
スレッドを利用しなくても部分参照が可能な言語ではデータ競合が容易に発生してしまう

後者の例はこのスレ既出でベクター型においてその何番目かの要素の参照を持っているときに
要素追加が行われると再配置によりダングリングを引き起こしたり
要素挿入が行われると再配置がなくてもズレて意図せず異なる要素を指してしまうデータ競合が起きる

>>369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い

このように色々なデータ競合がプログラミングで発生するが
Rustではデータ競合が発生せずコンパイルエラーとなる
これは非常に大きな強み
2023/04/22(土) 19:37:17.80ID:pFB+K5t4
>>370
> 369の例の別の人の購入データになってしまったりするバグも様々なデータ競合により引き起こされることが多い
データ競合が発生しなくても、単なる論理ミスでも発生するから、Rustでも
ちゃんと正しい論理を書かなければ発生する。
2023/04/22(土) 19:40:54.01ID:iD47eBZH
ポインタは究極の共有オブジェクトだから、同様に管理する習慣が付けば、データ競合のミスは減りそうだよね
2023/04/22(土) 19:50:59.03ID:2MwGVm8+
>>371
それはビジネスロジックの論理バグ
プログラミング言語が何であろうと関係なく生じるのでこのスレの目的である言語の比較に無関係

そしてプログラミングのデータの取り扱いで発生する論理バグがデータ競合
データ競合はバグを引き起こしうるためプログラマーが回避しなければならない
Rustはコンパイルが通ればデータ競合がないことが保証される
任意のプログラミング言語に対してRustが有利
2023/04/22(土) 20:01:02.96ID:pFB+K5t4
メモリやデータ競合に関係したバグの送りにくさRustは有利ではある。
ただ、言語に求められるのはそれだけではない。
2023/04/22(土) 20:07:00.96ID:2MwGVm8+
>>374
他の言語では起きないまたは起こりにくいバグが
Rustだと起きるまたは起きやすい例ってある?
その例を示せないとRustが最強になってしまうよ
2023/04/22(土) 20:10:28.97ID:YMOkCFj1
Visual Studio でC++のMFCや C#のWPFのようにGUI開発がサポートされたら新規ソフトはRustになっていきそう
逆に現状のままなら開発元のMozilla以外はLinuxカーネルみたいなマニアックな用途だけで終わりそう
2023/04/22(土) 20:13:15.69ID:pFB+K5t4
>>375
あるけど言わない。それは自分で気付かないと。
なぜ言わないかと言えば、その情報を元に論文書いたり、
国から研究費貰ったりする人がいるから。
2023/04/22(土) 20:17:17.43ID:ZakZodsv
let mut hoge: Vec<Vec<String>> = vec![Vec::with_capacity(3); 4];
のとき
hoge.len() は 4
hoge[0].len() は 0
hoge[0].capacity() は 3 を期待していたのですが何故か常に 0 になってしまいます

Why?
2023/04/22(土) 20:58:04.53ID:SKSgk+MB
vec![expr; n]は内部でclone使うんだけど、Vecのcloneはcapacityまでは複製しないみたい
複製はできるだけ余剰メモリをカットしたい気がするから仕様だろうな

fn main() {
let a: Vec<String> = Vec::with_capacity(10);
let b = a.clone();

println!("{}, {}", a.capacity(), b.capacity()); // 10, 0
}
2023/04/22(土) 20:58:54.89ID:+yUQZ3bR
データ競合を防ぐのは簡単で「multiple readers or single writer」を守れば防げる
どの言語でもそのような形になるようにプログラマーが解決する
ただしRust以外の言語はデータ競合があっても検出できずに競合を起こしたまま動いてしまいバグとなる

>>377
存在しない

>>378
vec!は回数分のcloneするだけ
そしてcloneはcapacityを保持しない
だからその0となる挙動は仕様通りで正しい
その3となる挙動にしたいなら例えば
Vec::from_iter((0..4).map(|_| Vec::with_capacity(3)));
あるいはrepeat_withでtake(4)
2023/04/22(土) 21:09:18.75ID:iios9sCz
やっぱりC++のstd::variant欲しいっすな
Refに対応したCow作ったけどなかなかだるい(というか標準で対応してくれの感が激しかった)し
こんどはRc<RefCell<T>>と&Tのenumが欲しい
わざわざ作るのもだるい
2023/04/22(土) 21:09:58.95ID:XW9UuYWq
制約は安全性を高めるためなんだろうけど率直に言ってウザいからな
他人に書かせるならRustを選ぶかもしれんがw
自分で書くものにはRustは不要かな
2023/04/22(土) 21:26:41.96ID:suBXXmuN
マルチスレッドの主な用途は数値計算なんだけど、数値計算だと
データ競合が起きるような場合はシミュレーション結果がおかしくなるので
テスト段階で分かることが多い。また、脆弱性とも関係無い。
脆弱性が問題になるのは、主にブラウザ。
自分のマシンのセキュリティーホールに悪さをするアホはいない。
つまり、脆弱性とはネットと関係する場合にのみおきると言っても過言ではない。
だから、シミュレーションとかは脆弱性とは関係が無いので、
データ競合が起きたら、結果がおかしくなるだけ。
2023/04/22(土) 21:26:48.13ID:2MwGVm8+
>>377
ついに嘘つき敗北宣言『あるけど言わない。』を出したのか
2023/04/22(土) 21:29:51.72ID:2MwGVm8+
>>382
Rustでウザい制約って何かある?
必要な制約は当然あるけど不要な制約はないんじゃないか
2023/04/22(土) 21:30:53.79ID:suBXXmuN
>>384
いや、有る。
2023/04/22(土) 21:36:25.12ID:suBXXmuN
ここの人達は、自分と意見が合わない人を馬鹿だと思ってる気がするけど、
それは違うぞ。
俺は貴重な意見を言っている。
まあ、日本全国探しても貴重だろう。
だけど、全部は大事なところは言わん。
2023/04/22(土) 21:38:49.06ID:2MwGVm8+
>>383
データ競合はタイミングなどで稀にしか発生しないものも多い
テストで何度か実行すれば必ず判明するわけではない
そして特定の分野でのみ発生するものではない

>>386
もし>>375の例があると主張するなら例を出しなよ
2023/04/22(土) 21:39:07.62ID:OFX5zT+6
無能である上に突っ込まれるのが怖くて意見表明すらできない
負け犬極まれりだな
2023/04/22(土) 21:41:53.93ID:suBXXmuN
>>388
>データ競合はタイミングなどで稀にしか発生しないものも多い
数学的に考えているから、細かいミスが取れた後は大丈夫。
脳内で証明済みのアルゴリズムを使うから。
才能の無い人は誰かが考えたアルゴリズムを真似て使うのだろう。
俺はそんなことはしてない。
2023/04/22(土) 21:42:53.35ID:suBXXmuN
>>389
自分の周りと同じにしないほうがいいぞ。
付きぬけている人をみたことがないみたいだな。
2023/04/22(土) 21:46:36.12ID:XW9UuYWq
>>377
自分がそれをネタに論文を書く予定でもないなら
別に良いのでは?
2023/04/22(土) 21:49:17.49ID:suBXXmuN
>>392
姿を隠して情報収集ってか。
2023/04/22(土) 21:50:20.64ID:+yUQZ3bR
>>390
データ競合を引き起こしてきたプログラマーたちは皆そのように言っている
「自分はデータ競合を引き起こさないように(アルゴリズムを考えて)コードを書いた」
しかし実際にはデータ競合が起きた
データ競合はRustのようにプログラミング言語で防いだほうが好ましい
2023/04/22(土) 21:51:10.61ID:suBXXmuN
>>394
俺とそいつらの頭脳は同じではない。
2023/04/22(土) 21:54:28.66ID:suBXXmuN
Mozillaは、凡庸な技術者しかいないからRustが必要になった。
それだけの話。
もっとも、普通の企業はそんなもんだろうが。
2023/04/22(土) 21:55:58.32ID:XW9UuYWq
データ競合起きたら意図と異なりデタラメな結果になるので
すぐ分かると思うよ
2023/04/22(土) 21:57:39.05ID:XW9UuYWq
>>393
こんなところで姿を出す訳にいかないじゃないか!
俺はコンパイラ屋ではない
2023/04/22(土) 22:00:29.73ID:SKSgk+MB
>>385
文字列全体(String)とその一部の参照(&str)を同じ構造体に詰めないとか
オブジェクト指向言語に慣れた人だと辛いと思う
厳密にはC++でも難しい(&strの初期値で悩む)けどこっちはまだごまかせるし

上の方でもちょっと書いたけど行ロックを意識したDBのテーブル設計に近い印象
とりあえず全項目を1つのテーブルに突っ込むみたいな方法だと途中で引っ掛かるから
大雑把な人には面倒な言語かもしれない
2023/04/22(土) 22:03:16.47ID:suBXXmuN
>>397
俺の経験から言ってもそう思う。
テスト時に働かないような「if 文」を入れたりしない限りは。
バグが取れない人は、変なところに if 文を入れている。
数学的な理想世界では基本的には if は存在しないことがおおい。最小と最大の
付近以外では。
だから、数学的に考えられる人は if 文は最低限しか入れないで済む。
このルールを守っていれば、滅多なことで妙なバグは入らない。
2023/04/22(土) 22:11:27.43ID:+yUQZ3bR
>>396
つまりRust採用を進めているGoogleやMicrosoftやAWSなどIT各社は凡庸な技術者しかいないからRustが必要になったとの主張??
キチガイじみてるね
2023/04/22(土) 22:15:02.54ID:suBXXmuN
>>401
いや、Microsoftは、「凡庸な技術者」もいるが、優秀なのも居る。
2023/04/22(土) 22:19:29.86ID:2MwGVm8+
>>399
それはString内容が変わったり空になったら意味のないデータになったり無効メモリを指すから、非GC言語でその設計はよくないね
Rust本スレで話題があったようにもう少し詳細な用途毎にstring_cacheやtyped_arenaを使ったりそういう自作設計をして安全と効率を両立させるべきかと
2023/04/22(土) 22:35:35.61ID:XW9UuYWq
>>401
使ってる例が出始めたってだけで
GoogleやMicrosoftやAWSで書かれる全コードの何%なのやら...
405デフォルトの名無しさん
垢版 |
2023/04/22(土) 22:41:58.79ID:DWNDga3I
>>383
>マルチスレッドの主な用途は数値計算なんだけど
へぇーw
406デフォルトの名無しさん
垢版 |
2023/04/22(土) 22:42:49.07ID:Bx6uBAXU
「数学的」な人だったかww
2023/04/22(土) 22:42:53.24ID:/en2DlgL
rustcがソースコードを採点してくれるのに
なぜ採点結果ではなく書いた文字の量を競っているんだ
2023/04/23(日) 00:09:49.30ID:XReMgABv
>>399
>文字列全体(String)とその一部の参照(&str)を同じ構造体に詰めないとか
JavaやC#でそういうことする??
2023/04/23(日) 00:35:50.04ID:s119dOFU
>>408
例えばURL全体を受け取ってパースした結果の部分文字列を保持する場合とか

JavaとC#は全部Stringにするから関係ないけどRustで同じことをしようとしたときに
本体のStringと一緒に部分文字列の&strを持ちたいと考えるかもしれない

あと?を2つ重ねるとなんか頭悪そうに感じるからやめたほうが…
2023/04/23(日) 00:46:01.33ID:XReMgABv
>>409
完全にダメな設計だね
??は皮肉だから
411デフォルトの名無しさん
垢版 |
2023/04/23(日) 00:52:26.01ID:hjyESha+
オブジェクト指向全く関係ないな
2023/04/23(日) 03:53:33.10ID:a38AwUhr
>>397
データ競合は実行タイミングや入力データなどによって発生したりしなかったりすることもある
だから実行してみて不具合が無ければ大丈夫というものではない

>>400
そういうお子様プログラミングしかしたことがないやつに複雑な状況でのコードは理解できないだろう
2023/04/23(日) 08:58:13.51ID:XDoVkNXv
>>380
>ただしRust以外の言語はデータ競合があっても検出できずに競合を起こしたまま動いてしまいバグとなる

Rustで実行時にデッドロックを回避する方法を教えてくれ
2023/04/23(日) 09:05:15.73ID:mbhtlP00
デッドロックはデータ競合ではなく無関係
デッドロックはロック順序を守ることで防ぐ
2023/04/23(日) 09:57:26.70ID:yqsq+eY1
rustコンパイラじゃ防げない
2023/04/23(日) 10:01:44.66ID:bH2G2Xj3
Rust初心者だけど、シングルスレッドでしか動かさない場合にも、
マルチスレッドで起きるデータ競合を気にしてるってことよね
それはめんどくさくない?
2023/04/23(日) 10:07:31.97ID:yqsq+eY1
気にしてるのはコンパイラ
418デフォルトの名無しさん
垢版 |
2023/04/23(日) 10:21:19.31ID:mWycOQ2H
>>416
シングルスレッドでも起こる
データ競合が防げるというのはメモリ安全性の副産物
2023/04/23(日) 10:47:08.19ID:SLeXOLnV
ライブラリがマルチスレッドかもしれんだろ、そういうとこ油断しちゃだめだw
2023/04/23(日) 10:59:51.10ID:yqsq+eY1
>>418
>データ競合が防げるというのはメモリ安全性の副産物
関係ないのでは?
2023/04/23(日) 11:05:41.04ID:5RizofHX
>>391-392
Qi痛のネタ程度の話を論文って言っちゃう人って

>>396
それだ!
2023/04/23(日) 11:26:29.64ID:L76w/S48
フリーソフトで遊んでる場合にも、お金に関する問題を気にしてる奴が一番めんどくさいぞ
2023/04/23(日) 11:41:38.27ID:SLeXOLnV
各社だいたい優秀なんだろうけど、飲酒コーディングするような香具師も混じってるってことだよ
デバフだデバフw
2023/04/23(日) 11:45:11.86ID:s119dOFU
参照のread-writeロックもどきは↓みたいなコードを防いでる

fn main() {
let mut a = vec![42];
let r = &a[0];
println!("{r}"); // 42
a.clear();
println!("{r}"); // もういないよ
}
2023/04/23(日) 13:20:52.91ID:L76w/S48
a[0]をコピーまたはcloneできる場合にも&a[0]を使うのはめんどくさい
Tをコピーまたはcloneできる場合にもRefCell<T>を使うのはめんどくさい
2023/04/23(日) 13:21:04.29ID:XDoVkNXv
>>409-410
Rust の hoge()? って頭悪そうだよな
2023/04/23(日) 13:43:48.93ID:s119dOFU
C#は
int? hoge = null;
int fuga = hoge ?? -1;
まで進歩してるからhoge()?くらいなら余裕
2023/04/23(日) 18:41:22.14ID:y593Lq73
C/C++ で安全なコードを描ける人からすれば Rust なんてホント苦行でしかない
全然生産性上がらないぞω
2023/04/23(日) 19:13:33.85ID:1wjDCw27
>>428
逆だな
C++で安全なコードを書ける人にとってRustは楽勝
430デフォルトの名無しさん
垢版 |
2023/04/23(日) 20:15:54.20ID:njNVQguc
C/C++で安全なコードを描けると思ってるやつはもはやレガシープログラマー
2023/04/23(日) 20:20:12.47ID:Rh211EN3
つまり結局のところRustは苦しいと
そう思わないやつはC++で安全なコードを書けると思い込んでいる人であると
それか大したプログラムを書いたことがないか
2023/04/23(日) 20:38:12.61ID:SLeXOLnV
酷い目に遭ったことがないんだろう
慣れるまでに、自分が踏み抜いたり、他人が踏み抜いたとばっちりを食ったりするんだけどね

ごりごり汗が書けるやつは、たしかにレガシ コーダだな
ちゃんと書けるなら、レガシにしてレジェンド
2023/04/23(日) 20:42:24.61ID:L76w/S48
Cは複雑なGUIを作らず、スクリプトのインタプリタを作るから結構安全だ
外見重視でインタプリタ言語嫌いなOOPが危ない
2023/04/23(日) 22:43:02.30ID:9nArI2JN
>>425
コピーできる型でコピーが望ましいならそうすればいいだけだぞ
シーケンシャルにポインタを進めていく方が望ましい時はコピー可能か否かに関係なく参照のイテレータを使えばいい
コピーできる型で内部可変性が欲しいならばRefCellではなくCellを使え
2023/04/23(日) 22:48:39.88ID:9nArI2JN
>>428
コンパイル時点でメモリ問題やデータ競合の無いことが保証されるRustはもちろん開発効率がよい
時間と手間の大きな節約になる
2023/04/23(日) 23:07:42.53ID:yqsq+eY1
「C/C++ で安全なコードを描ける」=「メモリ問題やデータ競合の無」く書ける
なのでは?
経験を積むと書けるようになるよ
2023/04/23(日) 23:31:52.59ID:/tirlZFd
>>436
その根拠のない自信とミスが多くのバグとセキュリティホールを生んできた
一方で経験を積んだ者ならばC++でもRustでもどちらのコードも書けることも事実その通りだ
ならば客観的に各種問題のないことが保証されているRustのコードの方が選ばれる
2023/04/23(日) 23:38:05.13ID:s119dOFU
経験を積むと安全なコードを書けると言ってる人は過去に書かれたコードのメンテとかも経験してるんだろうか
当然前後のコードを全て確認したうえで安全なコードを書いてきたんだろうけど
確認作業の範囲を少しでも減らしたいとか考えたことないのかな
2023/04/23(日) 23:54:04.28ID:FpD4OybJ
俺がRustへ移った理由もそれ
開発でも保守や更新でも言語システムが自動的に確認作業をやってくれる
こちらはビジネスロジックのテストだけに専念できて非常に効率がいい
2023/04/23(日) 23:55:54.84ID:yqsq+eY1
>>437
根拠は自分の経験だよ
お前のことは知らんよ
2023/04/23(日) 23:56:47.54ID:yqsq+eY1
>>438,439
他人のコードについての見解は一理あると思う
2023/04/23(日) 23:57:54.34ID:yqsq+eY1
翻って>>382だな
2023/04/24(月) 00:16:29.06ID:TbIWWoB3
経験深いC++プログラマーにとって、Rustは難しいものでもなく特にウザいものでもないよなあ。
部分的に各片方が書きやすい面もあるが、フィフティフィフティでどちらにも分はある。
結局Rustコンパイラが色々と保証してくれる信頼性と効率性だけが決定的な差異で、Rustへ進む流れだろな。
2023/04/24(月) 00:17:39.52ID:5FvgLQUn
完璧なC++のコードを書けるやつならまぁそうすればいいけど、同僚も完璧に書けるかな?って話だよな
同僚も完璧なのが書ける? でも同僚もお前のことを「完璧に書ける奴」と認識してるとは限らない

そんで慢心の発生は自分自身を完璧と信じてるかと関係なく起こるわけで
2023/04/24(月) 00:25:06.29ID:6UK4+7Cd
普通にGC付きの言語を使えばそんなウジウジしなくていいのに
システムプログラマ以外にはrustもC++も縁遠い
2023/04/24(月) 00:29:33.47ID:6UK4+7Cd
速度を抜きにしてc++の利点は生ポインタを使って直感的にコードを書けたりするところにもあったと思う
それが今は捨てられたのでまあ他の言語でもいいじゃんと思う
2023/04/24(月) 00:40:24.53ID:/2/+f4dj
>>445
従来の非GC言語と比べて
Rustは以下の点でGC言語に近くなっていて書きやすいわー
・メモリや競合など色んなことをRustは安全だと保証してくれる
・メモリ解放も常に何もしなくてよくてRustは完全に自動でやってくれる
・各GC言語のモダンな機能がRustも取り入れていて便利に使える
という感じ
対象言語やコードによっては数倍Rustが速くて
エコでリソースコストも少なくて金銭的コストも数分の1になるのが魅力的
2023/04/24(月) 00:40:47.69ID:47nwKPG1
C++にあってRustにない特徴はCを包含していること
Rust派は欠点と考えているだろうが
この特徴がなければ普及しなかっただろうね
ハゲの慧眼だよ
2023/04/24(月) 01:05:01.61ID:GFnVwc83
>>445
そのへんC++はGC言語と比べて余分なコードレビューコストやメモリ関連のデバッグコストなどもかかっていたけど
Rustはコンパイラがやってくれるから困っていない
2023/04/24(月) 04:53:42.06ID:7IjMEuJY
個人的には、Rustは、メモリ安全であると言う以外に魅力は無いと思ってる。
しかも、Java、C#、JS、Ruby、PHP、Perl、Python、Kotlin、Go
は全てメモリー安全。
2023/04/24(月) 04:56:59.60ID:7IjMEuJY
それに、C++やCでずっとプログラミングしているが、メモリー関連バグが
生じる頻度は非常に低い。大部分はロジックのバグで、少しずつテストを
するのでその段階で取れることが多い。
メモリー関連バグが起きる場合でも、VisualStudioでは容易に原因箇所が
発見できることが多い。
特にC++では、デストラクタの中に ポインタ型のメンバ変数の delete 文を
書いておけば、メモリー関連バグはまず起きない。
その意味では、C++は、それで賄えない特殊な場合を除いては、メモリー解放が
自動化されていると言える。
2023/04/24(月) 05:04:26.63ID:7IjMEuJY
メモリー関連バグは、VisualStudioではコンパイル段階での静的な発見は一般的
には出来ないが、動的には、デバッガを使うことでかなり高い確率でメモリー
関連バグの原因箇所が分かる様になっている。
昔、C言語を使っていて、メモリー関連バグで困るのは、全く原因が分からないような
ことがありえることであったが、C++では、classのデストラクタの中にdelete文を
閉じ込めることによって、メモリー解放が自動化される。
だから、メモリー関連バグが起きるのは、それでまかなえない場合に限る。
同じ関数の上の方とnew文と下の方でdelete文を単純に対応させて書けば
「どう見ても安全」のような書き方ができる。
また、それで書けない場合でも、delete文を、EndXxx()のような「終了関数」
の中だけに書く様にすれば、滅多なことでメモリー関連バグは入らない。

これでも原因不明なメモリー関連バグが起きた場合でも、VisualStudioの
場合はあの手この手で、メモリー関連バグの原因を動的検査で特定し易くなっている。
2023/04/24(月) 05:06:00.35ID:7IjMEuJY
CやC++でメモリー関連バグに悩まされている人は、gccなどのフリーのコンパイラ
を使っている人ではないかと思う。
Visual StudioのIDEとデバッガを使えば、メモリー関連バグで悩むことは滅多に
なくなる。
それと、C++の場合は、正しい流儀で書けば、そもそもメモリー関連バグが
入り込む可能性が劇的に減る。
2023/04/24(月) 05:12:08.93ID:7IjMEuJY
gccとVisual Studioのメモリー安全性に関する違いは、ヒープメモリに対しての
さまざまな工夫に有る。プログラマが明示的に初期化して無い部分には 0xcccccccc
のようなデータで初期化するコードをコンパイラが書きこむ。
それに、ヒープメモリーのリンクチェーンにも何らかの工夫がされている。
「デバッグビルド」では、そういった構造を、適切なタイミングでチェックする
コードが自動的に付加されるので、「おかしなことをやった直後に近いタイミングで」
IDEが「異常」を報告してくれる。
また、MFCの場合は、さまざまな場所にASSERT() 文で検査コードを入れてあるので、
メモリー関連バグも気付き易い。なんらかの異常は、早い段階で発覚するので、
原因がどこにあるかが特定し易くなっている。
このおかげで、多くの場合は、異常が発見された直前の処理を疑えばよくなっている。
2023/04/24(月) 05:45:34.11ID:7IjMEuJY
SNSで、「オブジェクト指向は意味が無く、むしろ駄目」というような話題が
出ることがあるが、C++のclassのデストラクタは、メモリー安全性に大きく
寄与しており、Cよりもメモリー安全になっている。
逆にclassがなければ、メモリー管理にバグが入りやすかったことであろう。
それだけでも、「オブジェクト指向」の意味がある。
456デフォルトの名無しさん
垢版 |
2023/04/24(月) 07:52:58.48ID:HpPlDS3N
気をつければ大丈夫というのはプログラマーの考え方ではない
少なくとも向いてない
2023/04/24(月) 08:08:18.28ID:y0BYTv6v
c++erにとってRustはウザいけど、他人にライフタイム管理を強制できるというメリットが大きい。
基本的にRustは他人にやらせるための言語。
2023/04/24(月) 08:23:30.04ID:5e4ZDdTw
ツールやコンパイラがいろいろやってくれる優位性を語っておいて
Rustの利点に目をむけないって意味わからんなあ
2023/04/24(月) 08:50:49.89ID:r05pWbWI
セキュアコーディングについて、誰かがキメてくれるというのがデカい
Rustはそれをやったんだ

欲しいのはunsafeのやり方であって、それができるんならC++でもいいんだよ
そうと決まれば、処理系も実装者もどんどん追従する

だから、採用すると言い切ったんだから、APIもとっととRust化してほしい
そうしたら速攻で、unsafeがC++にも来る
460デフォルトの名無しさん
垢版 |
2023/04/24(月) 09:49:02.72ID:47nwKPG1
>>459
>セキュアコーディングについて、誰かがキメてくれるというのがデカい
>Rustはそれをやったんだ
まぁある方がマシだけどもrustcが検出してくれるのは一部で
>>451に指摘されてるように頻度が少ないので有用性は俺も疑問に思ってる
(率直に言ってあんまり嬉しくない)
2023/04/24(月) 10:03:11.22ID:Tyw8xG0A
Rustを難しいとかウザいとか言ってる人は単にまだ慣れていなかったり知識が足りていないだけだ
C++できちんとコーディングできていた人にとってRustは難しくなく慣れと知識を獲得した後はC++よりも全体効率がアップする
したがってRustを難しいとかウザいとか言ってる人の発言は全て無視してよい
2023/04/24(月) 10:18:34.43ID:47nwKPG1
>>461
覚えるの面倒くさいねん
将来性もまだちょっと...
だけど面白いので取り入れられるところはC++に取り入れてるよ
Arcパクらせて頂いた
2023/04/24(月) 10:33:40.77ID:r05pWbWI
>>1 のとおり、職務とかでやれといわれたらやるんだけど、
Rust勢がいうとおり、デファクトスタンダードになりそうなら、C++にもほぼ間違いなく「来る」だろうしねえ
それなら、安全になったC++でいいや、Rustに限らず、新言語とかたりぃな、とかは思う
新言語覚えるかわりに、安全になったC++勉強しなきゃだし、と言ってもいい
2023/04/24(月) 10:39:05.54ID:6eJhjjay
C++とRustの比較は簡単

両方使いこなせるプログラマーはどちらを選んでいるか?
・多くのことをコンパイラに任せられて開発保守効率の良いRust
・その逆でそれらの開発保守効率に劣るC++

企業はどちらを選んでいくか?
・客観的に各種の安全性が保証されるRustで書かれたコード
・その逆で各プログラマーの腕により保証されるC++で書かれたコード

プログラマーと企業どちらの視点に立っても
RustもC++も選べる環境状況にあるならば
新規のプロジェクト(案件)でC++を採用する動機は完全に無くなった
465デフォルトの名無しさん
垢版 |
2023/04/24(月) 10:47:20.17ID:47nwKPG1
>>464
企業の視点に立つとRustはプログラマが確保できんだろw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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