探検
C++ vs Rust
■ このスレッドは過去ログ倉庫に格納されています
2021/04/24(土) 08:04:49.48ID:nPKzA798
競え
228デフォルトの名無しさん
2021/11/22(月) 19:07:47.11ID:HWCOZSD4229デフォルトの名無しさん
2021/11/22(月) 19:18:39.97ID:4Q+A1yLL >>228
だからそのデータ構造をCでもC++でもなんでみいからはよソースコードで示せ
だからそのデータ構造をCでもC++でもなんでみいからはよソースコードで示せ
230デフォルトの名無しさん
2021/11/22(月) 19:19:12.02ID:5egSOJea231デフォルトの名無しさん
2021/11/22(月) 19:21:02.53ID:HWCOZSD4 >>230
>インデックスの番号を持つこととポインタを持つことでオーダーOが変わることはない
>次に各々への複数のポインタを持つには配列やリンクリストなどの構造が必ず必要となる
>いずれにせよポインタを使うことでオーダーOが変わることはない
なんで、このスレはこんなにレベルが低いの。
>インデックスの番号を持つこととポインタを持つことでオーダーOが変わることはない
>次に各々への複数のポインタを持つには配列やリンクリストなどの構造が必ず必要となる
>いずれにせよポインタを使うことでオーダーOが変わることはない
なんで、このスレはこんなにレベルが低いの。
232デフォルトの名無しさん
2021/11/22(月) 19:21:28.08ID:HWCOZSD4233デフォルトの名無しさん
2021/11/22(月) 19:27:10.84ID:DZQ1+JmR >>232
数学の専門家であってプログラミング経験がないからソースコード出せとの指摘には一切答えられないということかな
数学の専門家であってプログラミング経験がないからソースコード出せとの指摘には一切答えられないということかな
234デフォルトの名無しさん
2021/11/22(月) 19:32:17.29ID:fRCpO7Rh235デフォルトの名無しさん
2021/11/22(月) 19:43:59.25ID:HWCOZSD4 >>234
近いが、初期値が、{ &l5, &l1, &l123, &l25, ... };
のようになっているイメージ。
ただし、実際には、
・初期化子リストには書かず、プログラムの途中でリンクリストに挿入した直後に記録するような
ことが多い。
・ノードの識別を常にポインタで扱うので、& で書くことは無い。
・固定配列ではなく、それもまたリンクリストにすることが多い。
なぜなら、リンクリストは効率が良いことが多いから。
近いが、初期値が、{ &l5, &l1, &l123, &l25, ... };
のようになっているイメージ。
ただし、実際には、
・初期化子リストには書かず、プログラムの途中でリンクリストに挿入した直後に記録するような
ことが多い。
・ノードの識別を常にポインタで扱うので、& で書くことは無い。
・固定配列ではなく、それもまたリンクリストにすることが多い。
なぜなら、リンクリストは効率が良いことが多いから。
236デフォルトの名無しさん
2021/11/22(月) 19:46:52.11ID:HWCOZSD4 >>233
そうではなく、
・大規模すぎて、こういうところには抽出して書ききれない。
・言葉で書いたほうが理解し易いはずだと思った。
抽象概念を理解しにくい人がこんなに多いスレだとは思わなかったから。
・しかし、これだけ書いても理解できないと言うことは、具体的に書いても
ますますそのコードの本質的な意味が理解できないと思われる。
そうではなく、
・大規模すぎて、こういうところには抽出して書ききれない。
・言葉で書いたほうが理解し易いはずだと思った。
抽象概念を理解しにくい人がこんなに多いスレだとは思わなかったから。
・しかし、これだけ書いても理解できないと言うことは、具体的に書いても
ますますそのコードの本質的な意味が理解できないと思われる。
237デフォルトの名無しさん
2021/11/22(月) 19:57:10.45ID:43z4eYfr 中国共産党のお偉いさんって本当に偉いんですね
238デフォルトの名無しさん
2021/11/22(月) 19:57:37.97ID:43z4eYfr スレ間違えた まいいか
239デフォルトの名無しさん
2021/11/22(月) 20:02:20.61ID:fRCpO7Rh >>235
ある要素が複数のリストに所属するイメージでしょうか
例えば全要素が連なっているリストのn番目、特定の要素だけが抽出された別のリストのm番目に属すといったような
要素の削除に当たっては属するすべてのリストについて前後の要素からの参照を外す
ある要素が複数のリストに所属するイメージでしょうか
例えば全要素が連なっているリストのn番目、特定の要素だけが抽出された別のリストのm番目に属すといったような
要素の削除に当たっては属するすべてのリストについて前後の要素からの参照を外す
240デフォルトの名無しさん
2021/11/22(月) 20:03:50.15ID:5egSOJea 配列でもリンクリストでも他のコレクションでも全てに言えること
「格納要素が『データ本体でも、ポインタでも、何らかのid番号でも、他のインデックス番号でも、』そこは一切関係なく、様々な操作のオーダーOが変わることはない」
まずこの大原則をID:HWCOZSD4は理解できていないのたろう
だからポインタを使うと魔法のようにオーダーがO(1)になると勘違いしている
「格納要素が『データ本体でも、ポインタでも、何らかのid番号でも、他のインデックス番号でも、』そこは一切関係なく、様々な操作のオーダーOが変わることはない」
まずこの大原則をID:HWCOZSD4は理解できていないのたろう
だからポインタを使うと魔法のようにオーダーがO(1)になると勘違いしている
241デフォルトの名無しさん
2021/11/22(月) 20:04:15.63ID:HWCOZSD4242デフォルトの名無しさん
2021/11/22(月) 20:04:48.66ID:HWCOZSD4243デフォルトの名無しさん
2021/11/22(月) 20:05:43.93ID:fRCpO7Rh >>241
この一例もやはりRustでは実装できないのでしょうか
この一例もやはりRustでは実装できないのでしょうか
244デフォルトの名無しさん
2021/11/22(月) 20:07:17.81ID:HWCOZSD4245デフォルトの名無しさん
2021/11/22(月) 20:08:42.39ID:HWCOZSD4 >>244
[補足]
C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能。
なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
[補足]
C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能。
なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
246デフォルトの名無しさん
2021/11/22(月) 20:10:06.74ID:5egSOJea247デフォルトの名無しさん
2021/11/22(月) 20:11:54.24ID:4Q+A1yLL248デフォルトの名無しさん
2021/11/22(月) 20:14:36.47ID:EEj8G+es >>245
Rustでプログラミングをしたこともない人がデタラメな妄想を撒き散らしてるなw
Rustでプログラミングをしたこともない人がデタラメな妄想を撒き散らしてるなw
249デフォルトの名無しさん
2021/11/22(月) 20:14:53.48ID:HWCOZSD4250デフォルトの名無しさん
2021/11/22(月) 20:15:30.95ID:HWCOZSD4 >>248
うそつきは黙れ。
うそつきは黙れ。
251デフォルトの名無しさん
2021/11/22(月) 20:18:44.14ID:HWCOZSD4252デフォルトの名無しさん
2021/11/22(月) 20:21:30.15ID:4Q+A1yLL そもそもRustだって最悪UnsafeCell使えば1変数への多数読み書き参照は保持できるのだが
253デフォルトの名無しさん
2021/11/22(月) 20:27:13.86ID:4Q+A1yLL >>249
僕はリンクリストの速度がどうこう評価するつもりはあんまりなくて、
他言語で書かれたソースコードが本当にRustでは無理なのかを確認したいだけ
だから、その「Rustでは無理なコード」を見てみたい、と言っている
最悪ソースコードの中身は理解不能なものでもよい
僕はリンクリストの速度がどうこう評価するつもりはあんまりなくて、
他言語で書かれたソースコードが本当にRustでは無理なのかを確認したいだけ
だから、その「Rustでは無理なコード」を見てみたい、と言っている
最悪ソースコードの中身は理解不能なものでもよい
254デフォルトの名無しさん
2021/11/22(月) 20:27:43.67ID:43z4eYfr255デフォルトの名無しさん
2021/11/22(月) 20:29:18.57ID:0LbM6y2O Cursorを使えと何回言っても聞かない
テキストエディタの例では>>119のアイデアを完全無視
テキストエディタの例では>>119のアイデアを完全無視
256デフォルトの名無しさん
2021/11/22(月) 20:50:09.64ID:MtEs+7mt おれも興味があるな
C++では書けてRustでは書けないコード
リソースを無視すればチューリング完全だろうから
書けないなんて事はないはずで
何かしら制限を付けた上での「書けない」なんだろうけど
C++では書けてRustでは書けないコード
リソースを無視すればチューリング完全だろうから
書けないなんて事はないはずで
何かしら制限を付けた上での「書けない」なんだろうけど
257デフォルトの名無しさん
2021/11/22(月) 20:55:11.07ID:fRCpO7Rh >>245
Rust でも書けるように思えてしまったのですが、以下のコードはどこが間違っているのでしょうか
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7534885705cd5879f536acdf64947870
Rust でも書けるように思えてしまったのですが、以下のコードはどこが間違っているのでしょうか
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7534885705cd5879f536acdf64947870
258デフォルトの名無しさん
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 }]
}
プログラマを守るためそれをさせないのが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 }]
}
259デフォルトの名無しさん
2021/11/22(月) 21:13:26.74ID:7gi7NmEv >>255
Cursorでも無理だ。
Cursorでも無理だ。
260デフォルトの名無しさん
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 }]
実行結果はこちら
[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 }]
261デフォルトの名無しさん
2021/11/22(月) 21:17:24.64ID:DZQ1+JmR Rustの実装 (>>257) はポインタでの直接アクセスではなく配列への添え字アクセスだからオーバーヘッドが大きいとか言い出したらみんなで笑ってあげましょう
262デフォルトの名無しさん
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;
}
独自の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;
}
263デフォルトの名無しさん
2021/11/22(月) 21:27:13.68ID:7gi7NmEv >>261
ゼロコストが謳いなのに、ゼロコストで無い。
ゼロコストが謳いなのに、ゼロコストで無い。
264デフォルトの名無しさん
2021/11/22(月) 21:27:14.40ID:5egSOJea265デフォルトの名無しさん
2021/11/22(月) 21:33:11.94ID:fRCpO7Rh >>264
_b は単一の要素が複数のリストに属するという要件に対する実装ですね
面倒だったのでメンバーだけ用意して実装はしてないですが
タプル使ってるのも構造体定義が面倒だったため
というかできるできないを実証するための例なので細かいところは適当です
お好きなように修正してください
>>263
>>245 の
> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
というのはほかの言語ではゼロコストで実装できることを意味していますか?
それともRustでも実装できることを認めた上でのただの負け惜しみですか?
はたまたこれを書いたのは自分とは別の人と主張されるのでしょうか
_b は単一の要素が複数のリストに属するという要件に対する実装ですね
面倒だったのでメンバーだけ用意して実装はしてないですが
タプル使ってるのも構造体定義が面倒だったため
というかできるできないを実証するための例なので細かいところは適当です
お好きなように修正してください
>>263
>>245 の
> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
というのはほかの言語ではゼロコストで実装できることを意味していますか?
それともRustでも実装できることを認めた上でのただの負け惜しみですか?
はたまたこれを書いたのは自分とは別の人と主張されるのでしょうか
266デフォルトの名無しさん
2021/11/22(月) 21:34:40.04ID:fRCpO7Rh >>262
ゼロコストを定義してください
ゼロコストを定義してください
267デフォルトの名無しさん
2021/11/22(月) 21:37:06.49ID:7gi7NmEv268デフォルトの名無しさん
2021/11/22(月) 21:38:01.88ID:7gi7NmEv >>266
参照に関しては、参照がC言語の生ポインタと同じ速度で扱えること。
参照に関しては、参照がC言語の生ポインタと同じ速度で扱えること。
269デフォルトの名無しさん
2021/11/22(月) 21:38:56.97ID:fRCpO7Rh270デフォルトの名無しさん
2021/11/22(月) 21:49:14.11ID:EEj8G+es271デフォルトの名無しさん
2021/11/22(月) 21:56:48.89ID:7gi7NmEv >>269
1. データを格納している場所が配列になっているが、動的に長さを長くしようとすれば
動的配列と同様のコピー動作が生じてしまうから、その実装は、本来のLinkedListの
性質とはかなり異なる。リンクリストは速度的に安定である事が重要なのに、
この性質により、動的配列と同様に、時々大規模コピーが生じて、スパイク的に
速度が遅くなる減少を伴うことになってしまう。このようなスパイク的な
速度低下は、twitterかFacebook のどちらか忘れたが、どっかのSNSでも問題
になっていた。
2. アクセスするときに、番号を配列のアドレスに変換する動作を毎回行っている。
1. データを格納している場所が配列になっているが、動的に長さを長くしようとすれば
動的配列と同様のコピー動作が生じてしまうから、その実装は、本来のLinkedListの
性質とはかなり異なる。リンクリストは速度的に安定である事が重要なのに、
この性質により、動的配列と同様に、時々大規模コピーが生じて、スパイク的に
速度が遅くなる減少を伴うことになってしまう。このようなスパイク的な
速度低下は、twitterかFacebook のどちらか忘れたが、どっかのSNSでも問題
になっていた。
2. アクセスするときに、番号を配列のアドレスに変換する動作を毎回行っている。
272デフォルトの名無しさん
2021/11/22(月) 22:00:19.83ID:7gi7NmEv >>271
[補足]
誤解を招いて議論に混乱を来たしそうなので捕捉しておくと、
271の2で書いた「番号」は、リンクリストの先頭からの通し番号の事ではなく、
今回示されたリンクリスト風のコードで、内部で用いられている配列の添え字番号
のことで、リンクリストの先頭からは、辿っていっても、連続した番号には成ってないもの。
[補足]
誤解を招いて議論に混乱を来たしそうなので捕捉しておくと、
271の2で書いた「番号」は、リンクリストの先頭からの通し番号の事ではなく、
今回示されたリンクリスト風のコードで、内部で用いられている配列の添え字番号
のことで、リンクリストの先頭からは、辿っていっても、連続した番号には成ってないもの。
273デフォルトの名無しさん
2021/11/22(月) 22:05:48.24ID:fRCpO7Rh >>271
あらゆる言語で実装できないがRustでは実装できない
他の言語だと O(1) だが Rustだと O(N) になる
という主張を撤回されたと理解しました
そういうことでしたら私の方から言うことはなにもありません
またアロケーションについてはVecを実装が工夫されたコンテナ型に変えることで対応できそうですね
実装詳細のないまま議論してもしょうがないトピックなのでこれ以上こちらからレスを重ねることはやめます
ありがとうございました
あらゆる言語で実装できないがRustでは実装できない
他の言語だと O(1) だが Rustだと O(N) になる
という主張を撤回されたと理解しました
そういうことでしたら私の方から言うことはなにもありません
またアロケーションについてはVecを実装が工夫されたコンテナ型に変えることで対応できそうですね
実装詳細のないまま議論してもしょうがないトピックなのでこれ以上こちらからレスを重ねることはやめます
ありがとうございました
274デフォルトの名無しさん
2021/11/22(月) 22:10:00.62ID:7gi7NmEv >>271
[追加]
3. そこにさらに削除メソッドを実装したとしよう。
削除したノードに対する番号が、どこかのCursorの中にまだ生きた状態に
なっている場合、ダングリング参照と似た現象が起きる。
削除したノードの中を参照できてしまうのだ。
[追加]
3. そこにさらに削除メソッドを実装したとしよう。
削除したノードに対する番号が、どこかのCursorの中にまだ生きた状態に
なっている場合、ダングリング参照と似た現象が起きる。
削除したノードの中を参照できてしまうのだ。
275デフォルトの名無しさん
2021/11/22(月) 22:15:27.68ID:7gi7NmEv >>273
その主張、Rustの中に超軽量のインタプリタの様なものを載せておいて、
そのインタプリタの中ではランダムアクセスがO(1)のリンクリストが
完全に実装できることを示しただけだね。
しかも、追加すると、時々、大規模なメモリーコピーが生じるし。
newやmallocではそのようなメモリーコピーは生じない。
ノードを追加しても、リンクリスト中の他のノードの本当のマシン語レベルでの
線形アドレスが固定で変化し無いし。
あなたの実装では、それが変化してしまう。相対アドレスは変化しないが。
ベースアドレスが変化している。
その主張、Rustの中に超軽量のインタプリタの様なものを載せておいて、
そのインタプリタの中ではランダムアクセスがO(1)のリンクリストが
完全に実装できることを示しただけだね。
しかも、追加すると、時々、大規模なメモリーコピーが生じるし。
newやmallocではそのようなメモリーコピーは生じない。
ノードを追加しても、リンクリスト中の他のノードの本当のマシン語レベルでの
線形アドレスが固定で変化し無いし。
あなたの実装では、それが変化してしまう。相対アドレスは変化しないが。
ベースアドレスが変化している。
276デフォルトの名無しさん
2021/11/22(月) 22:19:00.36ID:fRCpO7Rh >>274
generational arenaという手法を利用することでダングリングポインタ的アクセスを検知してハンドリング可能になります
generational arenaという手法を利用することでダングリングポインタ的アクセスを検知してハンドリング可能になります
277デフォルトの名無しさん
2021/11/22(月) 22:19:03.44ID:7gi7NmEv278デフォルトの名無しさん
2021/11/22(月) 22:23:12.75ID:7gi7NmEv >>276
動的コストを掛けていいなら、C++でも安全性の高いものは作れるぞ。
ポインタも正しいメモリーブロックを指していることを動的に確認した後で
実際に参照するようなことは、C++でも出来るから。
Rustも配列の範囲チェックはやっているが、配列以外のアドレスでも、動的に
チェックしようと思えばいろいろなチェック法はある。
その一つの方法が、アドレスではなく、あなたが書いたような配列の中の
番号方式にしてしまうこと。
番号に対する配列要素がNULLになっていれば、動的にエラーを出力して
アプリを停止させる、などの方法が有る。
動的コストを掛けていいなら、C++でも安全性の高いものは作れるぞ。
ポインタも正しいメモリーブロックを指していることを動的に確認した後で
実際に参照するようなことは、C++でも出来るから。
Rustも配列の範囲チェックはやっているが、配列以外のアドレスでも、動的に
チェックしようと思えばいろいろなチェック法はある。
その一つの方法が、アドレスではなく、あなたが書いたような配列の中の
番号方式にしてしまうこと。
番号に対する配列要素がNULLになっていれば、動的にエラーを出力して
アプリを停止させる、などの方法が有る。
279デフォルトの名無しさん
2021/11/22(月) 22:25:32.33ID:fRCpO7Rh280デフォルトの名無しさん
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も標準のものとは別。
>> C/C++/Java/C#/JS/Ruby/Python など多くの言語では可能だが、Rust
だけが不可能
>> なので、Rustだけが仲間はずれであり、他の言語でできる事ができない。
>というのはほかの言語ではゼロコストで実装できることを意味していますか?
>それともRustでも実装できることを認めた上でのただの負け惜しみですか?
分かった。ゼロコストで無くて良いなら Rustでも実装できるということだね。
なるほど、今回の実装法のような裏技の発想は無かったよ。それは認める。
でも、ゼロコストでなくなるということは、RustがC/C++の代替になるという
説には反することになるね。
それと、C++, Java, C# では最初から標準ライブラリ的なもので最初から実装済み
なのに対して、あなたのやり方は、少なくとも標準のLinkedListではないね。
Cursorも標準のものとは別。
281デフォルトの名無しさん
2021/11/22(月) 22:37:35.24ID:0LbM6y2O 結局何がしたいのよ
ノードへの参照を持ったままリストを変更したいの?
ノードへの参照を持ったままリストを変更したいの?
282デフォルトの名無しさん
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++の実装に比べて速度的に不安定でありスパイク的に
遅くなるということだ。
何がしたいって、C/C++/C#/Javaでは、LinkedListへのアクセスがO(1)で
自由自在に出来るのに、標準のRust実装では出来ないことが問題なんだ。
それに、今回示された実装法では、内部では配列で実装されているから、
ノードを追加してい言って、配列の要素数を超える時には、新しい配列を
コピーして内部でコピー動作が生じる。これは、C++のnewよりも遥かに
遅い動作になってしまうし、スパイク的に時々生じるから速度的な安定性
が求められるソフトでは好ましくない現象。
また、実質的なダングリング参照的が生じることも指摘した。
結論は、このやり方で、C/C++などと同じO(1)にはなったものの、安全性も失われ、
ゼロコスト性も失われ、C/C++の実装に比べて速度的に不安定でありスパイク的に
遅くなるということだ。
283デフォルトの名無しさん
2021/11/22(月) 22:51:04.06ID:0LbM6y2O284デフォルトの名無しさん
2021/11/22(月) 22:52:27.47ID:7gi7NmEv285デフォルトの名無しさん
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)でアクセスするというのは、ポインタでアクセスすれば
当たり前の事で、どう説明していいのか分からない。マシン語では、間接参照の
[アドレス]
だけの話だから。
コンピュータの基礎から学び直してもらわないと理解してもらえないかも知れない。
マシン語を学んで欲しい。
>「LinkedListへのアクセスがO(1)で自由自在に出来る」
>が正確にはどういう意味かと聞いているんだ
Cの場合、ポインタでアクセスすれば、O(1)でリンクリストの
ノードを参照できるし、削除も出来る。
削除しても、他のノードのアドレスは変化しないから、ポインタも
書き換える必要も無い。
配列だったら、削除するとそれより後ろのノードの番号が全て
変化してしまうので、書き直さなくてはならない。
リンクリストでも、先頭からの通し番号を識別番号に
している場合には、同様にそれ以後のノードの全ての番号を書き換えないといけない。
リンクリストのノードにO(1)でアクセスするというのは、ポインタでアクセスすれば
当たり前の事で、どう説明していいのか分からない。マシン語では、間接参照の
[アドレス]
だけの話だから。
コンピュータの基礎から学び直してもらわないと理解してもらえないかも知れない。
マシン語を学んで欲しい。
287デフォルトの名無しさん
2021/11/22(月) 22:57:21.67ID:0LbM6y2O コンテナと各要素の&mutと&が同時に取れない件はsplitして借用の単位を分けるべし
Vec::split_at_mutと同様の発想
Vec::split_at_mutと同様の発想
288デフォルトの名無しさん
2021/11/22(月) 22:59:22.03ID:0LbM6y2O289デフォルトの名無しさん
2021/11/22(月) 23:01:06.85ID:7gi7NmEv >>285
どっちがデマだと思ってるのか知らんが、俺のはデマじゃないぞ。
実際に、今回の実装を示した彼は、俺の言ってることはある程度正しく理解していた。
つまり、基本的にデマじゃないということを理解した人がいるということだ。
ただし、彼は、ゼロコスト安全性である、ということを無視して独自実装したり、
参照を独自に修正したものを勝手に導入した誤魔化しがあったのが残念であった
だけだ。
つまり、俺の主張自体は、彼は本当は理解している。
理解しているが、悔し紛れに詐欺めいた独自実装をしたことだけが残念なだけだ。
どっちがデマだと思ってるのか知らんが、俺のはデマじゃないぞ。
実際に、今回の実装を示した彼は、俺の言ってることはある程度正しく理解していた。
つまり、基本的にデマじゃないということを理解した人がいるということだ。
ただし、彼は、ゼロコスト安全性である、ということを無視して独自実装したり、
参照を独自に修正したものを勝手に導入した誤魔化しがあったのが残念であった
だけだ。
つまり、俺の主張自体は、彼は本当は理解している。
理解しているが、悔し紛れに詐欺めいた独自実装をしたことだけが残念なだけだ。
290デフォルトの名無しさん
2021/11/22(月) 23:01:57.98ID:7gi7NmEv >>288
1つのリンクリストに対して、書き込み参照や読み込み参照を同時に複数持てない。
1つのリンクリストに対して、書き込み参照や読み込み参照を同時に複数持てない。
291デフォルトの名無しさん
2021/11/22(月) 23:13:17.79ID:5egSOJea292デフォルトの名無しさん
2021/11/22(月) 23:14:41.21ID:7gi7NmEv293デフォルトの名無しさん
2021/11/22(月) 23:15:37.93ID:WXoW4mOX unsafe で生ポインタ使えばCと同じ実装は確実にできるが
294デフォルトの名無しさん
2021/11/22(月) 23:15:41.59ID:NDd1353W リンクトリストな?
295デフォルトの名無しさん
2021/11/22(月) 23:16:05.08ID:5egSOJea296デフォルトの名無しさん
2021/11/22(月) 23:18:27.46ID:WXoW4mOX297デフォルトの名無しさん
2021/11/22(月) 23:18:40.37ID:7gi7NmEv298デフォルトの名無しさん
2021/11/22(月) 23:21:22.25ID:0LbM6y2O299デフォルトの名無しさん
2021/11/22(月) 23:22:12.49ID:7gi7NmEv300デフォルトの名無しさん
2021/11/22(月) 23:22:18.49ID:EEj8G+es >>292
ゼロコストって他のことでもそうだけど全くコストがかからないってことではない
必要最低限のことのみでそれ以外はゼロコストってこと
今回のRefCellならば並行プログラミングの時の書き換え競合が起きないことを保証する
RefCellはゼロコスト
ゼロコストでないと主張するならば他の対処方法を述べよ
ゼロコストって他のことでもそうだけど全くコストがかからないってことではない
必要最低限のことのみでそれ以外はゼロコストってこと
今回のRefCellならば並行プログラミングの時の書き換え競合が起きないことを保証する
RefCellはゼロコスト
ゼロコストでないと主張するならば他の対処方法を述べよ
301デフォルトの名無しさん
2021/11/22(月) 23:24:19.66ID:7gi7NmEv >>298
「策」があるっていうが、どんどん複雑化し、コストも増えているだろ。
「策」があるっていうが、どんどん複雑化し、コストも増えているだろ。
302デフォルトの名無しさん
2021/11/22(月) 23:28:31.00ID:7gi7NmEv >>300
俺も正直言うとRefCellとか出てくると複雑すぎてよくわからなくなってくるが、
RefCellは内部可変性に対するものだから、並行プログラミングを使わない時
にも使うことがあるはずだが。
俺も正直言うとRefCellとか出てくると複雑すぎてよくわからなくなってくるが、
RefCellは内部可変性に対するものだから、並行プログラミングを使わない時
にも使うことがあるはずだが。
303デフォルトの名無しさん
2021/11/22(月) 23:28:31.66ID:NDd1353W Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならRubyが妥当。
比較するならRubyが妥当。
304デフォルトの名無しさん
2021/11/22(月) 23:30:51.55ID:7gi7NmEv305デフォルトの名無しさん
2021/11/22(月) 23:33:19.88ID:WXoW4mOX コンパイラに安全性を保証してほしければ実行時のコストを払ってRefCellを使えばいいし、
そのコストを払いたくなければunsafe 使って自分で安全性を保証すればいいって話なんだが
そのコストを払いたくなければunsafe 使って自分で安全性を保証すればいいって話なんだが
306デフォルトの名無しさん
2021/11/22(月) 23:35:15.39ID:4Q+A1yLL 必要最低限のunsafeを使うのは大前提で、
それでもリンクリストがどうたらって話じゃなかったっけ・・・??
それでもリンクリストがどうたらって話じゃなかったっけ・・・??
307デフォルトの名無しさん
2021/11/22(月) 23:36:31.09ID:NDd1353W だからリンクトリストな?
308デフォルトの名無しさん
2021/11/22(月) 23:38:22.71ID:5egSOJea >>299
シングルスレッドマルチタスクでも競合は起き得る
そのため書き込み権限がある者がある瞬間に複数存在しないことを保証する(排他制御)ためにRefCellがある
マルチスレッドの場合は並列に起き得るからもっと厳しくてRefCellではダメでMutexやRwLockを使う
シングルスレッドマルチタスクでも競合は起き得る
そのため書き込み権限がある者がある瞬間に複数存在しないことを保証する(排他制御)ためにRefCellがある
マルチスレッドの場合は並列に起き得るからもっと厳しくてRefCellではダメでMutexやRwLockを使う
309デフォルトの名無しさん
2021/11/22(月) 23:39:08.56ID:NDd1353W Rustは安全性を追求した言語でC++と比較する物ではない。
比較するならVBAが妥当。
比較するならVBAが妥当。
310デフォルトの名無しさん
2021/11/22(月) 23:40:06.95ID:NDd1353W RustがC++をライバル視してきて非常にウットオシイ。
貴様のライバルはJavascriptだろ。
貴様のライバルはJavascriptだろ。
311デフォルトの名無しさん
2021/11/22(月) 23:41:22.24ID:7gi7NmEv312デフォルトの名無しさん
2021/11/22(月) 23:42:38.96ID:0LbM6y2O313デフォルトの名無しさん
2021/11/22(月) 23:44:32.43ID:5egSOJea >>311
それCでもC++でもダングリングポインタ発生の駄目プログラマーパターン
それCでもC++でもダングリングポインタ発生の駄目プログラマーパターン
314デフォルトの名無しさん
2021/11/22(月) 23:49:43.35ID:7gi7NmEv315デフォルトの名無しさん
2021/11/22(月) 23:55:11.62ID:4Q+A1yLL316デフォルトの名無しさん
2021/11/22(月) 23:58:04.28ID:7gi7NmEv >>315
参照先を削除するのは普通なことで、安全に行えるぞ。
参照とは、つまり、識別番号の代わりに使うものだからな。
参照はオブジェクトに付けられた名前みたいなもんだから、
逆に言えば、参照先を削除できないなら、削除する方法がほぼ無い。
参照先を削除するのは普通なことで、安全に行えるぞ。
参照とは、つまり、識別番号の代わりに使うものだからな。
参照はオブジェクトに付けられた名前みたいなもんだから、
逆に言えば、参照先を削除できないなら、削除する方法がほぼ無い。
317デフォルトの名無しさん
2021/11/23(火) 00:00:50.13ID:1c3aeddQ 何の話についてもまずは具体的なC言語のコードを示すべきじゃないかな
そうすればRustのコードを2種類みんなが出してくれるよ
・1つは元のC言語と同じ安全度で場合によってはunsafeを用いて実装
・もう1つはメモリ安全性を保証してunsafeを使わずに実装
つまり「C言語で出来ることはRustで必ず出来る」+「Rustではメモリ安全性を保証した実装も可能」
明らかにC言語よりもRustの方が能力も高く優れている
そうすればRustのコードを2種類みんなが出してくれるよ
・1つは元のC言語と同じ安全度で場合によってはunsafeを用いて実装
・もう1つはメモリ安全性を保証してunsafeを使わずに実装
つまり「C言語で出来ることはRustで必ず出来る」+「Rustではメモリ安全性を保証した実装も可能」
明らかにC言語よりもRustの方が能力も高く優れている
318デフォルトの名無しさん
2021/11/23(火) 00:00:51.12ID:16zHq7La >>314
残り9個の参照はそのノードが削除されたことを知る術がないからダングリングポインタになるってことだろ
残り9個の参照はそのノードが削除されたことを知る術がないからダングリングポインタになるってことだろ
319デフォルトの名無しさん
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 は何事も無くまったく安全に残せるし、何のバグも入らない。
こんな単純なロジック、何の問題も無い。
本来は、明らかに別のノードであれば問題ない。
C++では普通に安全にそれが行える。
リンクリストの中に、A, B, C という名前の人のデータが入っていて、
それぞれに対して1つずつそれぞれ、ポインタ pA, pB, pC が存在している時に
ポインタ pA を介してAを削除しても、B, C へのポインタ pB, pC は残っていて、
値も変更されることも絶対に無いから完全に安全。
Aさんのデータを削除する場合にはこのようなことが起きるが、その時には、
delete pA の後、pAを捨ててしまうだけで全く安全。
pB, pC は何事も無くまったく安全に残せるし、何のバグも入らない。
こんな単純なロジック、何の問題も無い。
320デフォルトの名無しさん
2021/11/23(火) 00:15:34.94ID:8Ju98kPx 同一のノードに10個の参照って意味ちゃうん?
321デフォルトの名無しさん
2021/11/23(火) 00:16:47.17ID:1c3aeddQ322デフォルトの名無しさん
2021/11/23(火) 00:20:07.35ID:xJBrssBV >>320
1つのリンクリストの異なる10個のノードに対する10個の参照。
1つのリンクリストの異なる10個のノードに対する10個の参照。
323デフォルトの名無しさん
2021/11/23(火) 00:21:41.44ID:/rTkTwIT324デフォルトの名無しさん
2021/11/23(火) 00:21:54.64ID:xJBrssBV >>321
何度もしているが、それはフェイク。
Cできることのうち、Rustでは追加コストを掛けずにはsafeモードで出来ないことはたくさん有る。
unsafeモードを使いまくれば別。
しかしそれではRustを使う意味が無い。
何度もしているが、それはフェイク。
Cできることのうち、Rustでは追加コストを掛けずにはsafeモードで出来ないことはたくさん有る。
unsafeモードを使いまくれば別。
しかしそれではRustを使う意味が無い。
325デフォルトの名無しさん
2021/11/23(火) 00:22:40.62ID:xJBrssBV >>323
C++ではなく、Cのリンクリストで考えよう。C++は別の複雑さを入れ込んだから。
C++ではなく、Cのリンクリストで考えよう。C++は別の複雑さを入れ込んだから。
326デフォルトの名無しさん
2021/11/23(火) 00:22:46.42ID:s6k3uLQ1 >>324
なぜRustを使う意味がないのですか
なぜRustを使う意味がないのですか
327デフォルトの名無しさん
2021/11/23(火) 00:25:21.42ID:xJBrssBV328デフォルトの名無しさん
2021/11/23(火) 00:26:18.34ID:6/+wazXE ああ、なるほど
安全性を考慮していないCのLinked Listと、安全性が保証されたRustのLinked Listを比較して、
Rustは遅い、できることが少なくて不便だ、みたいなことを述べてたわけか
Cでもメモリリークしないようにして、スレッドセーフにするとかしたら、途端に大変になりそう
安全性を考慮していないCのLinked Listと、安全性が保証されたRustのLinked Listを比較して、
Rustは遅い、できることが少なくて不便だ、みたいなことを述べてたわけか
Cでもメモリリークしないようにして、スレッドセーフにするとかしたら、途端に大変になりそう
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「高市さん負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 [樽悶★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- 【為替】対ドルで157円台、対ユーロ181円台に下落 財政悪化を警戒 [蚤の市★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 ★2 [おっさん友の会★]
- 【ペルソナ・ノン・グラータ】中国総領事の早期国外退去を首相に要請へ 自民・保守系グループ「日本の尊厳と国益を護(まも)る会」 [ぐれ★]
- 【悲報】倉田真由美「なんで高市は子供がいる家庭に2万円給付するの?子供がいる家庭ばかり優遇するのおかしくね?」 [802034645]
- 関係者「高市首相は円安のデメリットをいまひとつ、わかっていないようだ」 [435756605]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
- 山上の妹「母の部屋には安倍晋三が表紙の統一の機関紙がいつも置いてた」 [961870172]
- 【悲報】日本、パンダ0にwwwwwwwwwwww高市さんありがとう🐼 [271912485]
