C++ vs Rust

■ このスレッドは過去ログ倉庫に格納されています
2021/04/24(土) 08:04:49.48ID:nPKzA798
競え
2021/11/22(月) 20:04:48.66ID:HWCOZSD4
>>240
アホか。
俺は現実世界では天才と言われてるのに。
2021/11/22(月) 20:05:43.93ID:fRCpO7Rh
>>241
この一例もやはりRustでは実装できないのでしょうか
244デフォルトの名無しさん
垢版 |
2021/11/22(月) 20:07:17.81ID:HWCOZSD4
>>243
読み込みオンリーに限定して、一切削除もしないという条件なら可能。
ノードの中に書き込んだり、ノードを削除するなら、不可能。
2021/11/22(月) 20:08:42.39ID:HWCOZSD4
>>244
[補足]
C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能。
なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
2021/11/22(月) 20:10:06.74ID:5egSOJea
>>243
C言語で可能なことはRustでも可能

>>244
嘘つき
2021/11/22(月) 20:11:54.24ID:4Q+A1yLL
>>236
gistでもどこでもいいからコード貼り付けてリンクここに貼ってください
日本語でうだうだ話すより議論が早く終わるでしょうあなたの言うことが正しければ
2021/11/22(月) 20:14:36.47ID:EEj8G+es
>>245
Rustでプログラミングをしたこともない人がデタラメな妄想を撒き散らしてるなw
2021/11/22(月) 20:14:53.48ID:HWCOZSD4
>>246
デタラメ一言ってんじゃないぞ!!

>>247
具体例を書いても、それはレアケースだの、本質的にはリンクリストの速度では
間違った評価が下るだけ。

そもそも、極簡単な話を書いてるのに理解できないのにコードを書いても理解できる
とは思えない。
そもそも、ランダムアクセスの意味すら理解出来て無い、ここの人達は。
2021/11/22(月) 20:15:30.95ID:HWCOZSD4
>>248
うそつきは黙れ。
2021/11/22(月) 20:18:44.14ID:HWCOZSD4
>>246
>>244 は、Rustの借用規則からそうなってる。
2021/11/22(月) 20:21:30.15ID:4Q+A1yLL
そもそもRustだって最悪UnsafeCell使えば1変数への多数読み書き参照は保持できるのだが
2021/11/22(月) 20:27:13.86ID:4Q+A1yLL
>>249
僕はリンクリストの速度がどうこう評価するつもりはあんまりなくて、
他言語で書かれたソースコードが本当にRustでは無理なのかを確認したいだけ

だから、その「Rustでは無理なコード」を見てみたい、と言っている
最悪ソースコードの中身は理解不能なものでもよい
2021/11/22(月) 20:27:43.67ID:43z4eYfr
>>249
説明するつもりもないのに、お前らはどうせ理解もできないバカだ、俺はいつも数学100点の天才だ、俺を信じろ

とか言ってても狂人扱いされるだけに決まってるじゃん・・・
2021/11/22(月) 20:29:18.57ID:0LbM6y2O
Cursorを使えと何回言っても聞かない
テキストエディタの例では>>119のアイデアを完全無視
2021/11/22(月) 20:50:09.64ID:MtEs+7mt
おれも興味があるな
C++では書けてRustでは書けないコード

リソースを無視すればチューリング完全だろうから
書けないなんて事はないはずで
何かしら制限を付けた上での「書けない」なんだろうけど
2021/11/22(月) 20:55:11.07ID:fRCpO7Rh
>>245
Rust でも書けるように思えてしまったのですが、以下のコードはどこが間違っているのでしょうか

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=7534885705cd5879f536acdf64947870
2021/11/22(月) 21:10:18.70ID:ejqG4gpN
>>216
プログラマを守るためそれをさせないのがRustっていう言語ではw
Rc<RefCell>ではいかんの?

https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=50e9fc65e69dd1859478ee62dde963aa
fn main() {
use std::collections::LinkedList;
use std::rc::Rc;
use std::cell::RefCell;
let mut list: LinkedList<Rc<RefCell<i32>>> = LinkedList::new();
list.push_back(Rc::new(RefCell::new(1)));
list.push_back(Rc::new(RefCell::new(2)));
list.push_back(Rc::new(RefCell::new(3)));
println!("{:?}", list); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
let mut vec: Vec<Rc<RefCell<i32>>> = Vec::new();
let mut it = list.iter();
vec.push(Rc::clone(it.next().unwrap()));
vec.push(Rc::clone(it.next().unwrap()));
vec.push(Rc::clone(it.next().unwrap()));
println!("{:?}", vec); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
println!("{:?}", vec[1]); // RefCell { value: 2 }
*vec[1].borrow_mut() = 22;
println!("{:?}", vec[1]); // RefCell { value: 22 }
println!("{:?}", list); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
println!("{:?}", vec); // [RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
}
2021/11/22(月) 21:13:26.74ID:7gi7NmEv
>>255
Cursorでも無理だ。
2021/11/22(月) 21:14:06.15ID:ejqG4gpN
あっコメントはミスってる
実行結果はこちら
[RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
[RefCell { value: 1 }, RefCell { value: 2 }, RefCell { value: 3 }]
RefCell { value: 2 }
RefCell { value: 22 }
[RefCell { value: 1 }, RefCell { value: 22 }, RefCell { value: 3 }]
[RefCell { value: 1 }, RefCell { value: 22 }, RefCell { value: 3 }]
2021/11/22(月) 21:17:24.64ID:DZQ1+JmR
Rustの実装 (>>257) はポインタでの直接アクセスではなく配列への添え字アクセスだからオーバーヘッドが大きいとか言い出したらみんなで笑ってあげましょう
2021/11/22(月) 21:26:20.75ID:7gi7NmEv
>>257
独自のLinkedListで、実装としては配列を持っていて、
ノード間が参照でリンクされておらず、添え字番号でリンクしており、
get(), set()が添え字番号を返して配列要素を返しているので
ゼロコストではないね。

struct LinkedList<T> {
 first_idx_a: Option<usize>,
 first_idx_b: Option<usize>,
 elems: Vec<Elem<T>>,
}
struct Cursor {
 a_idx: usize,
}
fn get(&self, elem: Cursor) -> &T {
 &self.elems[elem.a_idx].data
}
fn set(&mut self, elem: Cursor, data: T) {
 self.elems[elem.a_idx].data = data;
}
2021/11/22(月) 21:27:13.68ID:7gi7NmEv
>>261
ゼロコストが謳いなのに、ゼロコストで無い。
2021/11/22(月) 21:27:14.40ID:5egSOJea
>>257
それで実装も動作も良いけど
_bはどちらも不要
_a.0と_a.1はそれぞれprevとnextと書いたほうが読みやすい
2021/11/22(月) 21:33:11.94ID:fRCpO7Rh
>>264
_b は単一の要素が複数のリストに属するという要件に対する実装ですね
面倒だったのでメンバーだけ用意して実装はしてないですが
タプル使ってるのも構造体定義が面倒だったため
というかできるできないを実証するための例なので細かいところは適当です
お好きなように修正してください

>>263
>>245
> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。

というのはほかの言語ではゼロコストで実装できることを意味していますか?
それともRustでも実装できることを認めた上でのただの負け惜しみですか?
はたまたこれを書いたのは自分とは別の人と主張されるのでしょうか
2021/11/22(月) 21:34:40.04ID:fRCpO7Rh
>>262
ゼロコストを定義してください
2021/11/22(月) 21:37:06.49ID:7gi7NmEv
>>265
後半のあなたの主張、おかしくないか。
Rustの参照では無い独自の参照風の様な構造を添え字番号で実装してしまって、
C言語より速度を落としているのだから、ゼロコスト性に反してる。
2021/11/22(月) 21:38:01.88ID:7gi7NmEv
>>266
参照に関しては、参照がC言語の生ポインタと同じ速度で扱えること。
2021/11/22(月) 21:38:56.97ID:fRCpO7Rh
>>267
あらゆる言語の中でRustだけが実装できないという主張は撤回されて
CにRustは劣るという主張へと変更されるのですね?
2021/11/22(月) 21:49:14.11ID:EEj8G+es
>>257
elements_aはinto_iterにしたらあかんの?と思ったけど
2つ持った時の前半用として用意した意味なのかw
2021/11/22(月) 21:56:48.89ID:7gi7NmEv
>>269
1. データを格納している場所が配列になっているが、動的に長さを長くしようとすれば
 動的配列と同様のコピー動作が生じてしまうから、その実装は、本来のLinkedListの
 性質とはかなり異なる。リンクリストは速度的に安定である事が重要なのに、
 この性質により、動的配列と同様に、時々大規模コピーが生じて、スパイク的に
 速度が遅くなる減少を伴うことになってしまう。このようなスパイク的な
 速度低下は、twitterかFacebook のどちらか忘れたが、どっかのSNSでも問題
 になっていた。
2. アクセスするときに、番号を配列のアドレスに変換する動作を毎回行っている。
2021/11/22(月) 22:00:19.83ID:7gi7NmEv
>>271
[補足]
誤解を招いて議論に混乱を来たしそうなので捕捉しておくと、
271の2で書いた「番号」は、リンクリストの先頭からの通し番号の事ではなく、
今回示されたリンクリスト風のコードで、内部で用いられている配列の添え字番号
のことで、リンクリストの先頭からは、辿っていっても、連続した番号には成ってないもの。
2021/11/22(月) 22:05:48.24ID:fRCpO7Rh
>>271
あらゆる言語で実装できないがRustでは実装できない
他の言語だと O(1) だが Rustだと O(N) になる
という主張を撤回されたと理解しました

そういうことでしたら私の方から言うことはなにもありません

またアロケーションについてはVecを実装が工夫されたコンテナ型に変えることで対応できそうですね
実装詳細のないまま議論してもしょうがないトピックなのでこれ以上こちらからレスを重ねることはやめます
ありがとうございました
2021/11/22(月) 22:10:00.62ID:7gi7NmEv
>>271
[追加]
3. そこにさらに削除メソッドを実装したとしよう。
 削除したノードに対する番号が、どこかのCursorの中にまだ生きた状態に
 なっている場合、ダングリング参照と似た現象が起きる。
 削除したノードの中を参照できてしまうのだ。
2021/11/22(月) 22:15:27.68ID:7gi7NmEv
>>273
その主張、Rustの中に超軽量のインタプリタの様なものを載せておいて、
そのインタプリタの中ではランダムアクセスがO(1)のリンクリストが
完全に実装できることを示しただけだね。
しかも、追加すると、時々、大規模なメモリーコピーが生じるし。
newやmallocではそのようなメモリーコピーは生じない。
ノードを追加しても、リンクリスト中の他のノードの本当のマシン語レベルでの
線形アドレスが固定で変化し無いし。
あなたの実装では、それが変化してしまう。相対アドレスは変化しないが。
ベースアドレスが変化している。
2021/11/22(月) 22:19:00.36ID:fRCpO7Rh
>>274
generational arenaという手法を利用することでダングリングポインタ的アクセスを検知してハンドリング可能になります
2021/11/22(月) 22:19:03.44ID:7gi7NmEv
>>274
[補足]
実質的なダングリング参照が起きるということは、Rustのもう一つの柱である
ところのメモリー安全性が部分的に壊れてしまってるということだ。
2021/11/22(月) 22:23:12.75ID:7gi7NmEv
>>276
動的コストを掛けていいなら、C++でも安全性の高いものは作れるぞ。
ポインタも正しいメモリーブロックを指していることを動的に確認した後で
実際に参照するようなことは、C++でも出来るから。
Rustも配列の範囲チェックはやっているが、配列以外のアドレスでも、動的に
チェックしようと思えばいろいろなチェック法はある。
その一つの方法が、アドレスではなく、あなたが書いたような配列の中の
番号方式にしてしまうこと。
番号に対する配列要素がNULLになっていれば、動的にエラーを出力して
アプリを停止させる、などの方法が有る。
2021/11/22(月) 22:25:32.33ID:fRCpO7Rh
>>278
Rustの zero-cost abstraction はあなたの期待するような物ではありませんでした
残念でしたね
2021/11/22(月) 22:36:23.68ID:7gi7NmEv
>>265
>> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
>> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
>というのはほかの言語ではゼロコストで実装できることを意味していますか?
>それともRustでも実装できることを認めた上でのただの負け惜しみですか?

分かった。ゼロコストで無くて良いなら Rustでも実装できるということだね。
なるほど、今回の実装法のような裏技の発想は無かったよ。それは認める。
でも、ゼロコストでなくなるということは、RustがC/C++の代替になるという
説には反することになるね。

それと、C++, Java, C# では最初から標準ライブラリ的なもので最初から実装済み
なのに対して、あなたのやり方は、少なくとも標準のLinkedListではないね。
Cursorも標準のものとは別。
2021/11/22(月) 22:37:35.24ID:0LbM6y2O
結局何がしたいのよ
ノードへの参照を持ったままリストを変更したいの?
2021/11/22(月) 22:44:50.09ID:7gi7NmEv
>>281
何がしたいって、C/C++/C#/Javaでは、LinkedListへのアクセスがO(1)で
自由自在に出来るのに、標準のRust実装では出来ないことが問題なんだ。

それに、今回示された実装法では、内部では配列で実装されているから、
ノードを追加してい言って、配列の要素数を超える時には、新しい配列を
コピーして内部でコピー動作が生じる。これは、C++のnewよりも遥かに
遅い動作になってしまうし、スパイク的に時々生じるから速度的な安定性
が求められるソフトでは好ましくない現象。

また、実質的なダングリング参照的が生じることも指摘した。

結論は、このやり方で、C/C++などと同じO(1)にはなったものの、安全性も失われ、
ゼロコスト性も失われ、C/C++の実装に比べて速度的に不安定でありスパイク的に
遅くなるということだ。
2021/11/22(月) 22:51:04.06ID:0LbM6y2O
>>282
「LinkedListへのアクセスがO(1)で自由自在に出来る」
が正確にはどういう意味かと聞いているんだ

>>257の実装は忘れなさい
2021/11/22(月) 22:52:27.47ID:7gi7NmEv
>>281
>ノードへの参照を持ったままリストを変更したいの?
もちろん、それもある。
2021/11/22(月) 22:56:03.63ID:qBbb57Hy
デマを流すのはゼロコストなんだから相手にした時点で負け
286デフォルトの名無しさん
垢版 |
2021/11/22(月) 22:57:09.11ID:7gi7NmEv
>>283
>「LinkedListへのアクセスがO(1)で自由自在に出来る」
>が正確にはどういう意味かと聞いているんだ

Cの場合、ポインタでアクセスすれば、O(1)でリンクリストの
ノードを参照できるし、削除も出来る。
削除しても、他のノードのアドレスは変化しないから、ポインタも
書き換える必要も無い。
配列だったら、削除するとそれより後ろのノードの番号が全て
変化してしまうので、書き直さなくてはならない。
リンクリストでも、先頭からの通し番号を識別番号に
している場合には、同様にそれ以後のノードの全ての番号を書き換えないといけない。

リンクリストのノードにO(1)でアクセスするというのは、ポインタでアクセスすれば
当たり前の事で、どう説明していいのか分からない。マシン語では、間接参照の
[アドレス]
だけの話だから。
コンピュータの基礎から学び直してもらわないと理解してもらえないかも知れない。
マシン語を学んで欲しい。
2021/11/22(月) 22:57:21.67ID:0LbM6y2O
コンテナと各要素の&mutと&が同時に取れない件はsplitして借用の単位を分けるべし
Vec::split_at_mutと同様の発想
2021/11/22(月) 22:59:22.03ID:0LbM6y2O
>>286
だからそれだけならCursorMutでできるんだって
でもダメなんだろ?
それはなぜ?
2021/11/22(月) 23:01:06.85ID:7gi7NmEv
>>285
どっちがデマだと思ってるのか知らんが、俺のはデマじゃないぞ。

実際に、今回の実装を示した彼は、俺の言ってることはある程度正しく理解していた。
つまり、基本的にデマじゃないということを理解した人がいるということだ。
ただし、彼は、ゼロコスト安全性である、ということを無視して独自実装したり、
参照を独自に修正したものを勝手に導入した誤魔化しがあったのが残念であった
だけだ。
つまり、俺の主張自体は、彼は本当は理解している。
理解しているが、悔し紛れに詐欺めいた独自実装をしたことだけが残念なだけだ。
2021/11/22(月) 23:01:57.98ID:7gi7NmEv
>>288
1つのリンクリストに対して、書き込み参照や読み込み参照を同時に複数持てない。
2021/11/22(月) 23:13:17.79ID:5egSOJea
>>290
デマを流すのはそろそろやめとけよ
RustはRefCellもあるし複数からポインタで指しつつ書き換えもできるぞ
2021/11/22(月) 23:14:41.21ID:7gi7NmEv
>>291
そもそも、RefCellは、動的チェックが入るからゼロコストではない。
C には存在しないコストが新たに導入される。
2021/11/22(月) 23:15:37.93ID:WXoW4mOX
unsafe で生ポインタ使えばCと同じ実装は確実にできるが
294デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:15:41.59ID:NDd1353W
リンクトリストな?
2021/11/22(月) 23:16:05.08ID:5egSOJea
>>292
何を言ってるんだ?
そういうコストかけずにどうやって排他制御するんだよ?
2021/11/22(月) 23:18:27.46ID:WXoW4mOX
>>295
そこはCだとプログラマが気をつけることで排他制御してるんだと思うよ
unsafe Rustでも同じだけど
2021/11/22(月) 23:18:40.37ID:7gi7NmEv
>>295
C++と同じ事が出来るのに「ゼロコスト」で「安全」、と謳ってるのが間違いだと
言ってる。
間違いというより、デマや誇大宣伝。
2021/11/22(月) 23:21:22.25ID:0LbM6y2O
>>290
そうだ、最初からそう言えばよかったんだ
蓋を開けてみればO(1)なんかまるで関係無いじゃないか

でそれに対して>>287という策があるわけだがどう思う?
2021/11/22(月) 23:22:12.49ID:7gi7NmEv
>>295
「排他制御」とは、マルチスレッドプログラミングで使う用語なのだが、
本当にその意味で使ってるか?
2021/11/22(月) 23:22:18.49ID:EEj8G+es
>>292
ゼロコストって他のことでもそうだけど全くコストがかからないってことではない
必要最低限のことのみでそれ以外はゼロコストってこと
今回のRefCellならば並行プログラミングの時の書き換え競合が起きないことを保証する
RefCellはゼロコスト
ゼロコストでないと主張するならば他の対処方法を述べよ
2021/11/22(月) 23:24:19.66ID:7gi7NmEv
>>298
「策」があるっていうが、どんどん複雑化し、コストも増えているだろ。
2021/11/22(月) 23:28:31.00ID:7gi7NmEv
>>300
俺も正直言うとRefCellとか出てくると複雑すぎてよくわからなくなってくるが、
RefCellは内部可変性に対するものだから、並行プログラミングを使わない時
にも使うことがあるはずだが。
303デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:28:31.66ID:NDd1353W
Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならRubyが妥当。
2021/11/22(月) 23:30:51.55ID:7gi7NmEv
>>303
つまり、CやC++の代替には成りえない。
アプリレベルであってもC/C++の全てをカバーすることは出来ない。
2021/11/22(月) 23:33:19.88ID:WXoW4mOX
コンパイラに安全性を保証してほしければ実行時のコストを払ってRefCellを使えばいいし、
そのコストを払いたくなければunsafe 使って自分で安全性を保証すればいいって話なんだが
2021/11/22(月) 23:35:15.39ID:4Q+A1yLL
必要最低限のunsafeを使うのは大前提で、
それでもリンクリストがどうたらって話じゃなかったっけ・・・??
307デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:36:31.09ID:NDd1353W
だからリンクトリストな?
2021/11/22(月) 23:38:22.71ID:5egSOJea
>>299
シングルスレッドマルチタスクでも競合は起き得る
そのため書き込み権限がある者がある瞬間に複数存在しないことを保証する(排他制御)ためにRefCellがある
マルチスレッドの場合は並列に起き得るからもっと厳しくてRefCellではダメでMutexやRwLockを使う
309デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:39:08.56ID:NDd1353W
Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならVBAが妥当。
310デフォルトの名無しさん
垢版 |
2021/11/22(月) 23:40:06.95ID:NDd1353W
RustがC++をライバル視してきて非常にウットオシイ。
貴様のライバルはJavascriptだろ。
2021/11/22(月) 23:41:22.24ID:7gi7NmEv
>>291
LinkedListの中のノードへの参照を10個持っている状態で、
その参照を使って1個のノードを削除しようとしてコンパイルは通るか?
2021/11/22(月) 23:42:38.96ID:0LbM6y2O
>>301
safeであるためには必要なコストだと思うけどね
mutabilityが前後のノードに影響するデータ構造だから仕方がない
2021/11/22(月) 23:44:32.43ID:5egSOJea
>>311
それCでもC++でもダングリングポインタ発生の駄目プログラマーパターン
2021/11/22(月) 23:49:43.35ID:7gi7NmEv
>>313
そんなことないぞ。
vectorと勘違いして無いか。
2021/11/22(月) 23:55:11.62ID:4Q+A1yLL
>>311
参照先自体を削除するんじゃなくて、参照先からさらにnextとかprevたどってどっかのノードを削除するってこと?
参照先自体を削除するのはRustに限らず問題でるよね
2021/11/22(月) 23:58:04.28ID:7gi7NmEv
>>315
参照先を削除するのは普通なことで、安全に行えるぞ。
参照とは、つまり、識別番号の代わりに使うものだからな。
参照はオブジェクトに付けられた名前みたいなもんだから、
逆に言えば、参照先を削除できないなら、削除する方法がほぼ無い。
2021/11/23(火) 00:00:50.13ID:1c3aeddQ
何の話についてもまずは具体的なC言語のコードを示すべきじゃないかな
そうすればRustのコードを2種類みんなが出してくれるよ
 ・1つは元のC言語と同じ安全度で場合によってはunsafeを用いて実装
 ・もう1つはメモリ安全性を保証してunsafeを使わずに実装
つまり「C言語で出来ることはRustで必ず出来る」+「Rustではメモリ安全性を保証した実装も可能」
明らかにC言語よりもRustの方が能力も高く優れている
2021/11/23(火) 00:00:51.12ID:16zHq7La
>>314
残り9個の参照はそのノードが削除されたことを知る術がないからダングリングポインタになるってことだろ
2021/11/23(火) 00:08:02.67ID:xJBrssBV
>>318
本来は、明らかに別のノードであれば問題ない。
C++では普通に安全にそれが行える。
リンクリストの中に、A, B, C という名前の人のデータが入っていて、
それぞれに対して1つずつそれぞれ、ポインタ pA, pB, pC が存在している時に
ポインタ pA を介してAを削除しても、B, C へのポインタ pB, pC は残っていて、
値も変更されることも絶対に無いから完全に安全。
Aさんのデータを削除する場合にはこのようなことが起きるが、その時には、
delete pA の後、pAを捨ててしまうだけで全く安全。
pB, pC は何事も無くまったく安全に残せるし、何のバグも入らない。
こんな単純なロジック、何の問題も無い。
2021/11/23(火) 00:15:34.94ID:8Ju98kPx
同一のノードに10個の参照って意味ちゃうん?
2021/11/23(火) 00:16:47.17ID:1c3aeddQ
>>319
それだと>>311の条件を満たしていないのでやり直し
 ・いずれにせよC/C++で書けるコードはそのままの形でそのままの安全度で必ずRustでもunsafeを用いて書ける
 ・更にRustでは安全性を保証する形でunsafeを用いずに実装することもできる
C/C++よりもRustのほうが明白に能力が高い
2021/11/23(火) 00:20:07.35ID:xJBrssBV
>>320
1つのリンクリストの異なる10個のノードに対する10個の参照。
2021/11/23(火) 00:21:41.44ID:/rTkTwIT
>>319
C++でノードへのポインタは実装依存な方法でしか取れないよ
pAその他は本当にポインタ?イテレータではなく?
2021/11/23(火) 00:21:54.64ID:xJBrssBV
>>321
何度もしているが、それはフェイク。
Cできることのうち、Rustでは追加コストを掛けずにはsafeモードで出来ないことはたくさん有る。
unsafeモードを使いまくれば別。
しかしそれではRustを使う意味が無い。
2021/11/23(火) 00:22:40.62ID:xJBrssBV
>>323
C++ではなく、Cのリンクリストで考えよう。C++は別の複雑さを入れ込んだから。
2021/11/23(火) 00:22:46.42ID:s6k3uLQ1
>>324
なぜRustを使う意味がないのですか
2021/11/23(火) 00:25:21.42ID:xJBrssBV
>>326
Rustの売りはゼロコスト+安全性にあるからだよ。
どちらが掛けても意味が無い。
ゼロコストで無いなら既にC#やJavaがある。
安全で無いなら既にC++がある。
2021/11/23(火) 00:26:18.34ID:6/+wazXE
ああ、なるほど
安全性を考慮していないCのLinked Listと、安全性が保証されたRustのLinked Listを比較して、
Rustは遅い、できることが少なくて不便だ、みたいなことを述べてたわけか

Cでもメモリリークしないようにして、スレッドセーフにするとかしたら、途端に大変になりそう
2021/11/23(火) 00:26:36.02ID:s6k3uLQ1
>>327
違いますよ
2021/11/23(火) 00:27:06.93ID:8Ju98kPx
>>324
リンクトリスト内のメソッドでunsafeを閉じ込めることできると思うんだけどそれではだめなのか
2021/11/23(火) 00:28:01.20ID:8Ju98kPx
なんなら>>330は「基本的な操作のメソッドは」ってしてもいいけど
2021/11/23(火) 00:31:19.33ID:xJBrssBV
>>330
複数のノードへの読み書き自由なアクセスの速度をO(1)を保ったままで、
RustではunsafeをLinkedListのメソッド内には閉じ込めることが基本的に
出来ない。基本的に、と言ったのは、先ほど彼が示したリンク先の独自
実装の様に、ゼロコストであることを諦めてコストを掛ければできる
ようになるから。ただし、その場合、スパイク的にO(N)の時間でコピー
動作が発生してしまう。
2021/11/23(火) 00:32:59.52ID:xJBrssBV
>>332
[補足]
スパイク的なコピーの発生だけでなく、普段からコスト増加もある。
ベースアドレス + 相対アドレスでアクセスするから。
2021/11/23(火) 00:38:03.01ID:1c3aeddQ
>>262
その人が作ったLinkedList実装がポインタではなく格納配列のインデックスを使っているだけだよ
Rustの標準ライブラリのLinkedList実装ではポインタを使っています
std::collections::LinkedList
https://doc.rust-lang.org/std/collections/struct.LinkedList.html
2021/11/23(火) 00:39:30.31ID:xJBrssBV
>>334
それは分かってる。
で、標準の方は、ノードのアクセス速度に問題がある。
2021/11/23(火) 00:43:10.08ID:qrGqDm2c
>>335
RustはLinkedListでも問題を感じたことがないですが何を根拠に?
2021/11/23(火) 00:49:14.22ID:xJBrssBV
>>336
1つのリンクリストの異なる10個のノードに対する10個のmut参照を同時
に持ち事は出来ないので、O(1)でアクセスできないからだ。
2021/11/23(火) 01:04:38.76ID:qrGqDm2c
>>337
意味がわからないので具体的に意味のあるCコードを書いて
2021/11/23(火) 01:08:49.01ID:8Ju98kPx
Rustだと確かに複数個所のノードへの可変参照を得るのはunsafeメソッドになるだろうね
そのノードが全部別々であることが保証できないから
でもそれは他の言語でも同じで、例えば1のノードに複数の可変参照があって、
1の参照がノード消したらまずことになる

そしてunsafeを許すのなら、内部実装でUnsafe Cell使えばコンパイラからの見た目は不変参照になるから、
オーバーヘッドなしでそういうのは実装可能(ただしstdのLinkedListはそのようにはなっていない)

んで、複数個所のノードへの可変参照を得るというのは相当レアな操作なはずなので、
それはunsafeにしてもAPIの使い勝手としては全然問題はない
2021/11/23(火) 01:37:22.61ID:1c3aeddQ
あるC/C++コードがあった時
(A) 常にRustではC/C++コードと同じ安全度で(必要時はunsafeを用いて)実装できる
(B) ほとんどのケースでRustでは安全なコードを(unsafeを用いずに)実装できる

つまりRustの能力はC/C++を上回っている

言い換えると
C/C++を捨ててRustを使えば
(B) ほとんどのケースで安全性を保証する形で実装できる
(A) 残りのレアケースでもC/C++と同じ安全度で実装できる

したがってC/C++を用いずにRustを用いたほうがよい
2021/11/23(火) 05:32:01.67ID:RKGfozTd
安全性よりも、
とにかくパフォーマンスや使用リソースが最重要な用途がある
そういう所でC/C++が使われる

C/C++は少なくとも今後20年は使われ続ける
2021/11/23(火) 05:47:19.80ID:qrGqDm2c
>>341
RustはC/C++と同じパフォーマンスを出せます
>>340を読みましょ
C/C++からRustへ移ったほうが誰の目にも得です
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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