C vs C++ vs Rust Part.3

レス数が900を超えています。1000を超えると表示できなくなるよ。
2022/01/27(木) 22:19:47.56ID:avZQ9Wm7
闘え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
https://mevius.5ch.net/test/read.cgi/tech/1639539350/
2022/03/30(水) 08:14:44.56ID:MqQwCbKz
>>834
そのusingブロックを抜けるときに自動でDispose()が呼ばれるという話なら、
C++だとデストラクタでやるってのが>>814が言っていることかと。
usingより簡単だし例外でも問題なし。
2022/03/30(水) 08:18:15.81ID:qdlu4xZp
>>834
横だけど、std::ostreamてRAII使えなかったっけ?
コードは適当。

if (std::ofstream sw(filename)) {
sw << "test" << '\n';
} else {
std::cerr << "unable to open '" << filename << "'\n";
}
2022/03/30(水) 08:47:18.97ID:zgtKcvNm
>>834
C++向けに設計されたライブラリならデストラクタに終了処理を全部書いてあるのでusing構文自体が不要

スコープアウトでデストラクタが呼ばれる

std::ofstream fs("a.txt");
fs<<"test"<<std::endl;
2022/03/30(水) 08:57:42.45ID:zgtKcvNm
>>834
C#2.0以降に実装されてた糖衣構文の多くはC++には実装されていない

お前のC++の用語がところどころ違うから無知なようにしか見えない
2022/03/30(水) 10:15:21.19ID:sgjjbJfo
>>834
> ・$"X = {X}"
> ・null合体演算子
まあこれは全然違うレベルの話だけどこう言うところはC#はなかなか良く出来てると思う
2022/03/30(水) 13:15:41.55ID:ES6j8MQa
>>839
>fs<<"test"<<std::endl;

ファイルオープンできてるかどうかわからないのに書き込むのかよwww
C++てファイルオープンできてもないところに書き込んだときに
処理を停止せず、自動でうまく例外処理するおしゃれな機能なんてあったっけ?

using(var sw=new StreamWriter("a.txt")){
sw.WriteLine("test");
}

とじゃ全然意味が違うだろ
なんでエラーチェックしないの?
わざわざチェックしなきゃいけないかどうかの話をしてんだよ
わざと論点ずらすな

>C#2.0以降に実装されてた糖衣構文の多くはC++には実装されていない

その通り
それを問題にしてんの。
そのおかげでC++では生産性の向上が見られない
認めてるじゃねーかwww
2022/03/30(水) 13:54:11.00ID:nEZBRLmQ
C++ vs C#スレ立てるか?
2022/03/30(水) 14:02:35.35ID:uj+JKNAz
>>842
> ファイルオープンできてるかどうかわからないのに書き込むのかよwww
そういうのが欲しけりゃエラー時に例外を出すようにしとけばいいだけ
C# 使ってりゃそれぐらいわかるだろ

... 使えてりゃねw
2022/03/30(水) 15:37:33.26ID:Blieee3P
>>842
>>838は無視かよ。
ずいぶんと都合のいい目をしているんだな。
2022/03/30(水) 18:17:46.54ID:aaZp/+dN
>>838見ればC++がなぜ衰退していくかよくわかるな
2022/03/30(水) 18:28:11.81ID:4Wrqo5DU
>>846
なんで?
そこまでいうからにはきっちり説明してもらおうか。
説明できなきゃ馬鹿にしようかね。
2022/03/30(水) 20:08:24.48ID:WCI7hBXJ
iostreamなんて今使ってないだろ
849デフォルトの名無しさん
垢版 |
2022/03/30(水) 20:21:40.16ID:qIK9n1MF
> C#のusingみたいな構文

C#の発明と言うより、発祥は、お前らの嫌いな、Visual Basic(VBA)の、With〜
End Withじゃないかな?
2022/03/30(水) 20:22:04.28ID:UJJsLtPb
C++は例外がcharベースのwhatしかない時点で日本語Win上では実情と合わなくなるんよね。
2022/03/30(水) 20:22:32.28ID:/krHLZdG
>>834
Rustだと以下のようになる

> ・using

RustもC++と同じくRAIIなのでusingは不要
let mut file = File::create("a.txt")?;
file.write("test")?;
エラー時は?演算子で即returnとなり例外処理と類似状態になる
スコープを抜ける時に自動的にデストラクタdrop()が呼ばれる
何もしなくてもファイルなら自動closeされてロックなら自動解除される

> ・$"X = {X}"

Rustでは標準マクロ利用でほぼ同様の形式
format!("x={x}")

> ・null合体演算子

Rustは安全重視のため各型にnullやnilといった値が無い状態というものがない
そこで関数型言語と同様に代数的データであるenumを用いてジェネリックにT型に対してenum Option<T>型を使う
Option<T>型はT型の値tが存在する場合Some(t)と存在しない場合Noneの2つのenum値をとる
なのでnullに対応するものはNoneとなるが型が異なるので明白に区別できてミスがあればコンパイル時に検出可能
2022/03/30(水) 20:25:10.41ID:/krHLZdG
>>834
> ・null合体演算子

Rustでは>>851という状況なのでnull合体演算子についても少し概念が違ってくるが
xがNoneの時にDEFAULT_VALUEとしたい場合
x.or(Some(DEFAULT_VALUE)) でOption<T>型を得る
x.or(Some(DEFAULT_VALUE)).unwrap() でT型を得る
x.unwrap_or(DEFAULT_VALUE) が上記の簡易版でT型を得る

例えばC#での x ?? y ?? z を全てOption<T>型で表すと
Rustでは x.or(y).or(z) となりほぼ同じシンプルな表現

ちなみに?演算子によるNone時の即retun Noneも可能で
例えば各メソッドがOption<T>型を返すとするとこれでT型を得られる
let output = input.method1()?.method2()?.method3()?;
2022/03/30(水) 20:27:16.59ID:WCI7hBXJ
>>850
その例外ベースだけだとおもってるの?
クラスや型ならなんでも投げられるんだが
2022/03/30(水) 20:31:07.93ID:UJJsLtPb
それは例外そのものの型のことでしょ。
基本的にはexceptionの派生や孫で作られてるものが大半だからwhatでメッセージ受けるわけだが、
何のエンコードかは定かではない。
855デフォルトの名無しさん
垢版 |
2022/03/30(水) 20:33:36.81ID:qIK9n1MF
>>842
根本的な理解がない、残念君のご様子。

> std::ofstream fs("a.txt");

コンストラクタでOpenする場合、失敗すると例外がスローされるから、関数内
または上位でtry〜catchかな。 C#やJavaで毎回NULL参照チェック書いてるか?

いずれにしろ、オープンされていないオブジェクトが

> fs<<"test"<<std::endl;

に渡されることはない。 こうした処理は、オブジェクトのシリアライズ処理を実装
した関数内へ記述して、参照渡しでオープン済のオブジェクトを渡すのが一般的。
2022/03/30(水) 20:43:31.08ID:/krHLZdG
Rustにはnullも例外もなく
どちらも代数的データ型であるenumで表現するため
シンプルかつ安全性をコンパイル時に保証できる
2022/03/30(水) 21:06:36.60ID:UJJsLtPb
RustでC#のdynamicみたいなことやるにはどうするの?
2022/03/30(水) 21:23:30.04ID:yBbOBLyf
>>849
全然ちゃうわww
2022/03/30(水) 21:25:28.30ID:9xKIjqbP
>>857
C#はdynamic型という間違った方法を取ったため
C#は実行時エラーおよび実行時例外が発生し安全でない

Rustは型とは直行するトレイトがあるため
複数の様々な型に対して共通する振る舞いをトレイトとして実装できる
これらはコンパイル時にチェックされ実行時の安全性が保証される

更に加えてトレイトの利用方法は用途に向けて2種類用意されている
1つは利用時にimpl Traitで宣言する静的なトレイト利用であり
複数の様々な型に対して各々の静的に異なるコードが適用され高速である
もう1つは利用時にdyn Traitで宣言する動的なトレイト利用であり
複数の様々な型に対して実行時にダイナミックにディスパッチし柔軟である
2種類ともにコンパイル時にチェック確定するため
Rustではこれら実行時にエラーや例外が起きることはない
860デフォルトの名無しさん
垢版 |
2022/03/30(水) 21:55:25.20ID:qIK9n1MF
> Rustではこれら実行時にエラーや例外が起きることはない

実行時にメモリが足りなくなったら、Rustで書かれたプログラムは
どんな挙動を返すの?
2022/03/30(水) 21:57:54.53ID:UJJsLtPb
それだと使えないなぁ。
862デフォルトの名無しさん
垢版 |
2022/03/30(水) 21:58:03.62ID:qIK9n1MF
>>858
おなじだよ。 usingに一時オブジェクトを渡す場合に限って、usingの終わりと
オブジェクト寿命が同じなだけだ。
2022/03/30(水) 22:00:39.04ID:T6u2kz/X
毎度のことながら複オジのアホ解説読むと
Rust勧めてるのはこのレベルの人なのかと悲しくなる
無知にも程がある
2022/03/30(水) 22:05:28.12ID:qUkXH45r
>>860
それちゃんとよく読めよ
C#のdynamic型に対応するものの話だろ

ちなみにRustではメモリアロケータも変更可能&自作も可能でベアメタル含めて任意の環境に対応できる
だからメモリ不足時の対応も自由にできてOS等も書ける
もちろん一番単純な対処としてはpanic
2022/03/30(水) 22:07:51.84ID:jqrh8rWF
>>861
C#でのdynamic型で適用してる事項はすべて適用出来るでしょ
反例を持ってこない限りこれはC#側の負けよ
2022/03/30(水) 22:11:11.16ID:bu0twkVZ
>>862
With~End Withだけじゃなくusingも勉強し直した方がいいよ
リアルで恥を掻く前に
2022/03/30(水) 22:14:11.74ID:UJJsLtPb
対象なオブジェクトがrust内にあるわけでも存在してるかさえわからない状態なんだから、
実行時にはエラーや例外が発生すると思うのだが...
2022/03/30(水) 22:25:39.59ID:ALQUZfnd
>>867
どういう想定か曖昧すぎてわからないため一般的な話をすると
Rustにはnullもundefinedもないし
いわゆるtry-catch例外もないから
あるT型が求められる時の関数の返り型は>>851でも触れられているように代数的データ型となって
enum Option<T>型かenum Result<T, Err>型になるよ
これらはT型を取り出すために広い意味での分岐となるだけで普通に処理が進むね
869デフォルトの名無しさん
垢版 |
2022/03/30(水) 22:26:22.84ID:qIK9n1MF
>>866
お前がナー
2022/03/30(水) 22:31:08.47ID:YEeL7eMZ
>>867
それはC#でdynamic型を使って問題を解決している例ではないのでは?
例えばWebのDOM操作など色んな異なる型が返ってくるときのためにC#ではdynamic型を使う
Rustではそういう時にトレイトを使うので色んな異なる型が返ってきても対応できる
871デフォルトの名無しさん
垢版 |
2022/03/30(水) 22:34:21.72ID:qIK9n1MF
>>839
> usingより簡単だし例外でも問題なし。

>>842 は、

> using(var sw=new StreamWriter("a.txt")){

の、newに失敗すると、その時点で例外がスローされることを判ってないん
だろうな。
872デフォルトの名無しさん
垢版 |
2022/03/30(水) 22:37:02.42ID:qIK9n1MF
>>864
> ちなみにRustではメモリアロケータも変更可能&自作も可能

C++でもできるわけだが?
2022/03/30(水) 22:42:11.12ID:OkNrkUse
>>872
どこにもC++のことを否定していない書き込みに対して唐突のイチャモンやな

それならC++だけでなく
Cでもできるわけだが?
2022/03/30(水) 22:47:22.15ID:4xlnCCQ3
>>860
君は頭が悪いな
C#のdynamic型は失敗仕様であるという話だぜ
メモリが十分にあっても実行時エラーや例外で死んでしまう
コンパイラが検知できない仕様なためミスがあっても通してしまうからだ
2022/03/30(水) 22:50:27.28ID:NgOFxdTU
>>869
いや、マジで勉強したほうがいいぞ
using はスコープから拔ける時に Dispose 呼ぶだけ
寿命に感知はしないよ
2022/03/30(水) 23:09:24.22ID:4bDt5Vb4
dynamic自体は名前がわかってるreflectionをいちいち書くのダルいから妥当な導入ではある

ジェネリクスにC++20のrequiresみたいな制限があればdynamicなんていらなかったのは確かだが
2022/03/30(水) 23:15:44.80ID:SheiVyTd
実行時になってようやくエラーを引き起こし得るdynamicはC#の設計ミス
C++やRustは異なる解決をしている
2022/03/30(水) 23:59:52.46ID:Lj4LP6Zg
dynamicってそもそもリフレクション+式木でしょうが
こんなもん使うな
ジェネリック使え
2022/03/31(木) 00:03:05.89ID:EY1WgKK4
tagged-unionだよ
2022/03/31(木) 00:24:36.68ID:LBSBAbTE
ミスった時にコンパイルエラーを出せない仕様はよくないな

>>859
Rustでの対応は3種類だな
(1) ジェネリックにトレイト境界で制約して静的にモノモーフィゼーション
(2) ジェネリックにトレイト境界で制約して動的にディスパッチ
(3) enumでタグ付け収容して処理時分岐
いずれもプログラミングでミスれば実行時ではなくコンパイル時に早期エラー発覚できる
2022/03/31(木) 01:54:42.49ID:sTE3Pr3t
>>855
std::ofstreamのコンストラクタで例外を投げるってマジ?
普段からC++使ってるの?
2022/03/31(木) 15:47:20.37ID:TWJkYixT
>>832
リソース解放って構造体と紐づけるのは結構無理があると感じることが多い。
もっとコンテクストによるって方が一般的感覚だと思うわ。
そういう意味でdeferのが馴染む。
2022/03/31(木) 16:56:25.59ID:+qzJxbYZ
>>882
上にも書いたけど自由度は高いと思うけど忘れたり間違えたりしそうで怖い
2022/03/31(木) 17:43:45.66ID:TWJkYixT
デストラクタを正しく書く方が簡単で間違いと考えてる?あんまり理解できんな。
2022/03/31(木) 18:24:33.50ID:wBL3yx/w
>>884
デストラクタは一度書けばいいけどdeferは使う度に書かないとだめでしょ?
どっちが間違いやすいかは考えるまでもない
2022/03/31(木) 18:47:26.32ID:d1Z8MU3o
>>884
必要なものはだいたい標準ライブラリに入ってるから手書きで頑張る必要はないのでは
例外安全にするのがめんどくさいとかそういう話?
2022/04/02(土) 20:19:43.92ID:Yphv2UuC
https://discourse.llvm.org/t/rfc-lifetime-annotations-for-c/61377
clangの独自拡張としてだけどC++にlifetime入れようという議論があるんだね
2022/04/02(土) 20:54:43.62ID:ezdDFz2p
ライフタイム導入すればコンパイル時点でバグを発見できて
実行時の無駄なデバッグを減らせるし
メモリ関係の未知のセキュリティバグもコンパイル時点で検出できるもんな
2022/04/02(土) 22:41:04.77ID:5MtdHF70
これ以上C++を接ぎ木してこねくり回すの止めにしたら
2022/04/03(日) 11:55:08.48ID:W9pHkRzU
>>887
でもrustと同じならdoubly linked listは表現出来ないんでしょ?
2022/04/03(日) 12:04:52.85ID:llhYZSlD
>>889
C++ってかわいそうな運命だよなあ
2022/04/03(日) 16:13:05.78ID:9lFqLTmO
>>890
それはlifetime関係なくてxor mutabilityの話だよね
2022/04/03(日) 16:37:52.29ID:W9pHkRzU
>>892
なるほど
2022/04/03(日) 17:12:35.56ID:Qom6hzMo
>>890
Rustでは出来るよ
2022/04/03(日) 17:28:58.27ID:FsLhH6TX
>>885
そんなの一行書くだけろ。。むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
2022/04/03(日) 17:44:36.67ID:77d+30yb
>>895
> そんなの一行書くだけろ。。
できないプログラマーの典型で草
一行書くだけだから確実にできると言うならバグは無くなるわ

> むしろ意図通りのデストラクタが動いてるか怪しい挙動するデストラクタのが問題起こりまくりだわ。
それはお前の能力が足らんだけ
897デフォルトの名無しさん
垢版 |
2022/04/03(日) 17:49:59.46ID:rc6NcMYZ
>>895
defer使えば怪しい挙動は絶対しないとでも?
2022/04/03(日) 17:57:55.57ID:9lFqLTmO
デストラクタでリソースが解放されることを保証するのはデータ構造を定義する人だけど
deferの場合はデータ構造を使う人の責任になる

データ構造を定義する回数と使う回数では普通は後者の方が多くなるから
deferの方が間違いを起こしやすいと
2022/04/03(日) 19:34:48.12ID:W9pHkRzU
>>894
実行時にオーバヘッドが出る形でしか実現できないやん
2022/04/03(日) 20:40:47.40ID:9lFqLTmO
>>899
オーバーヘッドが出てるのって具体的に何のこと?
stdのLinkedListの実装にもオーバーヘッドあるの?
2022/04/04(月) 09:02:06.19ID:14cK0a9Z
>>900
LinkedListってunsafeで実装されてるんだけど静的にメモリセーフティを実現する言語機能があるRustでそれをするっておかしいよね?
それって行儀よく実装するとオーバーヘッドが出ることの裏返しだよね?ちょっとは頭を使おうか?
2022/04/04(月) 09:14:12.42ID:y2zkcNcq
>>901
えっ、じゃあなんでunsafeという機能がわざわざ用意されてるの?
頭使って考えてみて
2022/04/04(月) 09:31:58.76ID:WSInp7AV
>>901
linked listに限らず何でもunsafeで作られているよ
unsafeは悪ではなく、安全なインタフェースを備えた型やモジュールの内部に閉じ込めるもの
その結果Rustではプログラム全体の安全性を保証できる
悪なのはプログラム全体がunsafe状態なC/C++
2022/04/04(月) 09:56:40.12ID:88Lrr0N7
>>902
そりゃRustの型システムがオーバーヘッドが起こるやり方でしか安全性を保証できないからでしょ?
頭使えないんだねかわいそう
2022/04/04(月) 10:04:31.11ID:y2zkcNcq
>>904
そうそう、コンパイラとプログラマの責任範囲を明確化するための仕組みだよね
結局 >>899 で言いたかったのは safe rust だけで LinkedList を実装するとオーバーヘッドが生じると言うことだったんだね
2022/04/04(月) 10:09:11.84ID:9r+bgOYm
>>903
それってRustの型システムに基づいて行儀よく実装するとオーバーヘッドが出ることへの反論になってないよね?
つまりRustの型システムはdoubly linked listを含めたあらゆるデータ構造をオーバーヘッドなく実装できるほどの表現力がないってことだよね
2022/04/04(月) 10:23:50.48ID:y2zkcNcq
>>906
safe rustの範疇ではあらゆるデータ構造を表現できないのはその通り
なのでunsafeというescape hatchを用意している
rustはpureな言語ではないのでコンパイラですべての安全性を保証することは最初から狙ってないよ
2022/04/04(月) 10:34:53.41ID:M7C/Fpbq
>>906
それは違う
例えばVec(ベクタ)はRustが標準ライブラリで提供している型だが
LinkedList(二重リンクリスト)もRustが標準ライブラリで提供している型である
VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している
その両者に違いはなくRustによる安全性の保証に何も問題を及ぼしていない
2022/04/04(月) 13:39:53.90ID:RabHiWd3
オーバーヘッドwってことでいいじゃん
中途半端な知識でムキになるから無駄なやり取りが続くんだよ
2022/04/04(月) 15:17:06.36ID:ilb8jjlp
>>908
> VecもLinkedListも内部でunsafeを用いているが安全なインタフェースのみを公開している

ホントかなぁ。 ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?

これを防ぐには、ベクターやリスト自体はもちろん、各要素や生ポインタを含めて
あらゆる変数に参照カウンタを設けた上で、参照数が0になったタイミングでオブ
ジェクト自動破棄する必要があるが、まさにオーバーヘッド。
2022/04/04(月) 18:59:43.72ID:RDBERkGC
rustって、unsafe使っていても
メモリ安全のチェックはしてくれるって事であってる?
2022/04/04(月) 19:11:22.90ID:vi3Hd2oR
>>911
そんなことはない。
ttps://doc.rust-jp.rs/book-ja/ch19-01-unsafe-rust.html
2022/04/04(月) 19:18:31.93ID:UrWVuubJ
rustって、制限きついなら制限緩い他の言語に変換しやすいとかある?
2022/04/04(月) 20:04:42.98ID:0mSmJ0PC
標準ライブラリに問題がないって言い切れるの?
コンパイラとか標準ライブラリを盲信できるほど完成度高いんですかね
盲信してると不具合の発見に支障が出そう
2022/04/04(月) 20:07:34.39ID:Aq9lII9f
嫌なら使わなければいいだけやろ
2022/04/04(月) 20:19:31.81ID:VNZL7sLo
>>910
そんなRustの初歩くらいは学んでからレスしようぜw
2022/04/04(月) 20:23:28.80ID:y2zkcNcq
>>914
プログラムがバグった時にまず自分のコードを疑うべきと言える程度には信頼できると思うよ
2022/04/04(月) 20:28:34.57ID:88Lrr0N7
>>916
オーバーヘッドなのは否定できてなくて草
2022/04/04(月) 20:41:28.56ID:y2zkcNcq
>>910
> ベクターやリストが管理するオブジェクト参照を、別の参照ポインタ
> に代入して、ベクターやリストを破棄した後で参照を使うとぬるぽになりそうだけど?

以下のようなコードを意図してるんだと思うけど rust だとコンパイルエラーになるよ

let v = vec![Box::new(1), Box::new(2)];
let ptr = &v[1];
drop(v);
println!("{ptr}");

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=f4b4be3e93f71ec0828c6039dd156cb7
2022/04/04(月) 20:48:51.57ID:ZmDtAG5s
>>914
今までにコンパイラやライブラリのバグ見つけたことある?
自分が作り込んだバグとどっちが多かった?
2022/04/04(月) 21:00:31.84ID:V8HUi7lD
殆どの言語が標準ライブラリはバグってたりセキュリティの穴見つかったりして更新し続けてるがな。
2022/04/04(月) 21:11:15.35ID:y9KalPQq
メモリ安全性に関していえば
Rustなら不具合の可能性があるのはコンパイラとライブラリのunsafe領域だけだけど
(しかもそれらはそこそこの人数でチェックされている)
C/C++の場合ありとあらゆる箇所で可能性があるからな
盲信とかでなく単純に引く確率が低い
2022/04/04(月) 21:11:46.66ID:yn3hKO4L
libcにもバグあるしそれどころか
カーネルもヤバい問題発覚することがある
もうパソコンを窓から投げ捨てよう
2022/04/04(月) 21:41:12.90ID:dNgOu4No
>>921
だからそれお前が見つけたのか?
2022/04/04(月) 22:18:49.72ID:yJV2c6am
初心者ほど「コンパイラのバグ」などと言い出す
ダニング=クルーガー効果である
2022/04/04(月) 23:05:18.52ID:jLJ2cB6c
>>910
あまりにも無知なその知識でRustを叩くのは無理がある
そういうケースも含めて検出してくれるのがRust
だからRustはC++よりも圧倒的に優れている
2022/04/05(火) 06:13:13.50ID:l+kYPJyP
そろそろ飽きろよこの流れ
2022/04/05(火) 09:01:35.21ID:rwKxODkm
>>926
Rustはunsafe内のメモリ関連のバグまでは検出しないけど?
例えRustには無知だとしてもunsafeという語感からだけでunsafe内では何も保証されないってことは推測できるよね?
2022/04/05(火) 09:22:45.52ID:i/q849BZ
>>928
もちろんそう
それ以外の部分をRustは保証してくれるから大手IT企業を初めとして皆が採用している
全てがunsafeなC++を捨てつつある、
930デフォルトの名無しさん
垢版 |
2022/04/05(火) 11:55:20.23ID:Md/fZtCu
2038年問題を再発させるコードが多数の場所にコピーされてしまっている
ttps://gigazine.net/news/20220330-2038-problem/

> エイドリアンさんが調べた限りでは、下記のリポジトリにて問題のあるコードが使用されていたとのことです。
>
> O3DE
> Dokany
> Ceph-Dokan
> libarchive
> ghc::filesystem
> ImageMagick
> Cxbx-Reloaded
> ReactOS
>
> また、下記のリポジトリについては記事作成時点で既にエイドリアンさんの指摘を受けてコード修正済みとなっていました。
>
> OpenRCT2
> DuckStation
2022/04/06(水) 03:36:26.34ID:A9app5rs
>>919
それ、子スレッドで実行する関数に引数として渡して、スレッド終了を待たずに
親スレッド側で解放するとかしたら、コンパイルエラーにならないと思うけど?
2022/04/06(水) 03:42:32.00ID:ryRy0Ktk
>>931
そんなことは不可能だろう
まずは基本的知識を学べや
2022/04/06(水) 04:46:14.51ID:MueoLJZZ
エスパーさせんな、コードで示せ
2022/04/06(水) 09:00:45.09ID:Z4fh8uHR
>>931
見事な恥の上塗りでワロタ
935デフォルトの名無しさん
垢版 |
2022/04/06(水) 09:22:57.25ID:A9app5rs
>>932
何が不可能なの? 参照渡しされた場合、スレッド関数側ではメインスレッド側で
解放される変数の寿命が判らないから、参照カウントで実行時にはオブジェクト
寿命を管理できても、少なくともコンパイル時のエラーにはならないと思うが?

>>933
Rustやってないし、やる気もない。

ちなみに、919みたいなケースは実際にはそもそも書かないが、コンパイラ依存だけど
戻り値としてローカル変数への参照を返すとかは、最近のC++だと警告が出る。

可変引数のprintf()等でも、昔は書式制御文字列と引数の数や型が一致していなく
てもノーチェックだったけど、最近は警告が出るし。
2022/04/06(水) 09:29:13.74ID:OcEMaDN/
>>935
妄想で思い込みをして架空の意味のない話を進めて批判している
なんと愚かなことだろう
2022/04/06(水) 10:57:59.47ID:X0SajXCN
>>931
エラーになるよ

use std::{thread, time::Duration};

fn main() {
let v = vec![Box::new(1), Box::new(2)];
thread::spawn(|| {
thread::sleep(Duration::from_secs(100000));
let ptr = &v[1];
println!("{ptr}");
});
drop(v);
}

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=6ffcf2e259e138e27d653db6fdd4fc98
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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