1 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:04:49.48 ID:nPKzA798.net] 競え
331 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:22:40.62 ID:xJBrssBV.net] >>323 C++ではなく、Cのリンクリストで考えよう。C++は別の複雑さを入れ込んだから。
332 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:22:46.42 ID:s6k3uLQ1.net] >>324 なぜRustを使う意味がないのですか
333 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:25:21.42 ID:xJBrssBV.net] >>326 Rustの売りはゼロコスト+安全性にあるからだよ。 どちらが掛けても意味が無い。 ゼロコストで無いなら既にC#やJavaがある。 安全で無いなら既にC++がある。
334 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:26:18.34 ID:6/+wazXE.net] ああ、なるほど 安全性を考慮していないCのLinked Listと、安全性が保証されたRustのLinked Listを比較して、 Rustは遅い、できることが少なくて不便だ、みたいなことを述べてたわけか Cでもメモリリークしないようにして、スレッドセーフにするとかしたら、途端に大変になりそう
335 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:26:36.02 ID:s6k3uLQ1.net] >>327 違いますよ
336 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:27:06.93 ID:8Ju98kPx.net] >>324 リンクトリスト内のメソッドでunsafeを閉じ込めることできると思うんだけどそれではだめなのか
337 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:28:01.20 ID:8Ju98kPx.net] なんなら>>330 は「基本的な操作のメソッドは」ってしてもいいけど
338 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:31:19.33 ID:xJBrssBV.net] >>330 複数のノードへの読み書き自由なアクセスの速度をO(1)を保ったままで、 RustではunsafeをLinkedListのメソッド内には閉じ込めることが基本的に 出来ない。基本的に、と言ったのは、先ほど彼が示したリンク先の独自 実装の様に、ゼロコストであることを諦めてコストを掛ければできる ようになるから。ただし、その場合、スパイク的にO(N)の時間でコピー 動作が発生してしまう。
339 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:32:59.52 ID:xJBrssBV.net] >>332 [補足] スパイク的なコピーの発生だけでなく、普段からコスト増加もある。 ベースアドレス + 相対アドレスでアクセスするから。
340 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:38:03.01 ID:1c3aeddQ.net] >>262 その人が作ったLinkedList実装がポインタではなく格納配列のインデックスを使っているだけだよ Rustの標準ライブラリのLinkedList実装ではポインタを使っています std::collections::LinkedList https://doc.rust-lang.org/std/collections/struct.LinkedList.html
341 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:39:30.31 ID:xJBrssBV.net] >>334 それは分かってる。 で、標準の方は、ノードのアクセス速度に問題がある。
342 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:43:10.08 ID:qrGqDm2c.net] >>335 RustはLinkedListでも問題を感じたことがないですが何を根拠に?
343 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 00:49:14.22 ID:xJBrssBV.net] >>336 1つのリンクリストの異なる10個のノードに対する10個のmut参照を同時 に持ち事は出来ないので、O(1)でアクセスできないからだ。
344 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 01:04:38.76 ID:qrGqDm2c.net] >>337 意味がわからないので具体的に意味のあるCコードを書いて
345 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 01:08:49.01 ID:8Ju98kPx.net] Rustだと確かに複数個所のノードへの可変参照を得るのはunsafeメソッドになるだろうね そのノードが全部別々であることが保証できないから でもそれは他の言語でも同じで、例えば1のノードに複数の可変参照があって、 1の参照がノード消したらまずことになる そしてunsafeを許すのなら、内部実装でUnsafe Cell使えばコンパイラからの見た目は不変参照になるから、 オーバーヘッドなしでそういうのは実装可能(ただしstdのLinkedListはそのようにはなっていない) んで、複数個所のノードへの可変参照を得るというのは相当レアな操作なはずなので、 それはunsafeにしてもAPIの使い勝手としては全然問題はない
346 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 01:37:22.61 ID:1c3aeddQ.net] あるC/C++コードがあった時 (A) 常にRustではC/C++コードと同じ安全度で(必要時はunsafeを用いて)実装できる (B) ほとんどのケースでRustでは安全なコードを(unsafeを用いずに)実装できる つまりRustの能力はC/C++を上回っている 言い換えると C/C++を捨ててRustを使えば (B) ほとんどのケースで安全性を保証する形で実装できる (A) 残りのレアケースでもC/C++と同じ安全度で実装できる したがってC/C++を用いずにRustを用いたほうがよい
347 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 05:32:01.67 ID:RKGfozTd.net] 安全性よりも、 とにかくパフォーマンスや使用リソースが最重要な用途がある そういう所でC/C++が使われる C/C++は少なくとも今後20年は使われ続ける
348 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 05:47:19.80 ID:qrGqDm2c.net] >>341 RustはC/C++と同じパフォーマンスを出せます >>340 を読みましょ C/C++からRustへ移ったほうが誰の目にも得です
349 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 07:27:06.42 ID:RKGfozTd.net] 本当に良いことばかりなら ここで宣伝しなくても自然に広まるはず
350 名前:デフォルトの名無しさん [2021/11/23(火) 13:48:55.03 ID:VKZug2mU.net] いや、あわしろ氏もC++は窓から投げ捨てろと言ってる。
351 名前:ハノン mailto:sage [2021/11/23(火) 14:00:24.39 ID:A++o7U7T.net] >>344 その、あわしろ氏とやらは、では、なにを推薦しているのでしょうか?
352 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 14:20:23.73 ID:BTZW3nye.net] ほんとRust気持ち悪いなw リンクリストのような単純な構造でSTLでもboostでもそれ自体が「安全でない」ことはめったにない。 バグや脆弱性を作りこんでしまうのは多くは固定長のバッファに対するパース処理などで、確かに各種の *nixコマンドなんかはRustで書いて貰ったほうが良い場合があるが、C/C++の数msが致命となる世界で Rustが一般的となることはない。そんな布教をやってるから嫌われるんだよw 悔しかったらOpenSSLとか書き直して”安全なコード”で出してみろよ?WebkitにC/C++を排除させて Rustだけにさせてみろw
353 名前:デフォルトの名無しさん [2021/11/23(火) 14:29:53.22 ID:VKZug2mU.net] いまさらC++やってるようでは時代についていけない老害という評価しかない。
354 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 14:45:56.12 ID:CrSl9z1L.net] Linusも老害だしChromeコミッターも全部老害、気持ち悪さNo1のRustたちが敵を作りまくる自己評価で あらゆるスレで暴れてる
355 名前:ハノン mailto:sage [2021/11/23(火) 14:49:30.08 ID:A++o7U7T.net] >>348 linus を老害呼ばわりするとは…
356 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 14:56:32.81 ID:s6k3uLQ1.net] >>346 usじゃなくてmsなのか...
357 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 14:57:43.30 ID:2khltGI7.net] twitterでも、RustはHaskell程度にしか発言されて無い。 一方、C 言語 で検索すると一日分でも見ることが不可能なくらい大量に 発言されてることが分かる。 twitterでは「C++」というキーワードでは検索できないので推定するしかないが、 C 言語以上であろう。
358 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 15:54:02.42 ID:hMtNqdGd.net] >>340 >つまりRustの能力はC/C++を上回っている ダウト。 安全面に置いては上回っているが、効率面では下がるケースがかなりある。
359 名前:デフォルトの名無しさん [2021/11/23(火) 16:13:02.54 ID:hMtNqdGd.net] ・速度を落として安全性を高めたものは、既にJavaやC#がある。 ・Rustが仮に速度面ではCに比べて余り遅くならないケースが多いと 仮定しても(この仮定には嘘があるのだが)、使いこなすのがJavaやC# に比べると難しい。 特に参照関連だけでも、Option, Box, Rc, Arc, Cell, RefCell, Cursor, ref, & の理解が必要な他、mut &'a などの表記、 let mut a : mut &:T = mut& b や Option<Rc<RefCell<T>>> a; new Box<T>( T {・・・} ); のような解読が難しいシンタックスも多い。 このような複雑な表記は、JavaやC#には存在しない。 また、& と * の違いもあれば、& と ref の違いも有る。 let文ですらパターンマッチング方式になっているので Cのポインタの 10倍理解が難しい。 つまり、普通IQ者には理解が難しい。 逆に高IQ者は、C++でも安全に使えるし、C++を安全面では余り問題を感じて無い人が多い。
360 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 16:19:09.75 ID:hMtNqdGd.net] >>353 さらに言えば、 ・「自動参照外し」は便利だとされるが、逆に勝手に参照が外れることで、 他人の書いたコードの理解が難しいことがある。明記してるコードと 省略してるコードが同じことを意味してるのが理解しにくいので。 ・&の意味が、let文の左辺ではパターンマッチング、右辺では参照、 の意味になっているので混乱しやすい。左辺では参照をはずす意味 になってしまう。 ・&は、reference(参照)演算子と呼ばれるのに、ref という演算子もあるが、 これは、意味がかなり違うため、混乱し易い。 ・nullポインタを代入するポインタは、Option<Box<T>> のように長くなる。 ・ライフタイム注釈が発展途上中なのか、特に構造体に関するライフタイム注釈 のドキュメントが少なく、例で説明されるだけで、根本的な意味を書いた ドキュメントが存在して無い。
361 名前:ハノン mailto:sage [2021/11/23(火) 16:26:18.07 ID:A++o7U7T.net] >>353 IQの定義は?
362 名前:デフォルトの名無しさん [2021/11/23(火) 18:18:27.96 ID:VKZug2mU.net] LinuxはRustを第二言語と位置づけ、カーネル開発に積極利用する計画です。
363 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 18:21:55.09 ID:1c3aeddQ.net] C/C++/Rustをやってきた人ならRustが圧倒的にプログラミングしやすいことで一致している 調査結果でもRustが連続1位を続けていることからも客観的に明白
364 名前:デフォルトの名無しさん [2021/11/23(火) 18:23:28.79 ID:VKZug2mU.net] あわしろ氏もC++は終了する言語と言っています。
365 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 19:08:31.54 ID:s6k3uLQ1.net] >>353 例示してるシンタックス全部間違ってるし釣りだろこれ
366 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 19:22:32.43 ID:4h9SSBVx.net] >Rustが圧倒的にプログラミングしやすい うんこ嘘つき野郎
367 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 19:25:27.46 ID:1ymEsXZx.net] >>359 let mut a : mut &T = mut& b Box<T>::new( T {・・・} ); だったかも知れんな。 複雑すぎるし、C++との違いが大きすぎて覚えてない。 C++ だと、new クラス名で、Rubyだと確か、クラス名.new。 Rustは、後者に近い書き方だから、書き方だけを見てもRustはC++とはやはり遠い。
368 名前:デフォルトの名無しさん [2021/11/23(火) 19:43:48.41 ID:VKZug2mU.net] RustはRubyの影響を受けた言語。 大変使いやすい。
369 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 19:51:13.12 ID:1ymEsXZx.net] >>362 いくつか本を読んだが、スクリプト言語的な範囲で使うならばそうかも知れん。 しかし、C++やCのようにポインタを駆使したリンクリストやツリー構造の様な ものを効率よく高速に、メモリーも節約しながら扱うには、Rustはとても 複雑になる。訳の分からんCell,RefCellなどと組み合わせる必要があることも多い。
370 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 19:53:12.58 ID:/rTkTwIT.net] 訳が分かってから文句垂れてください
371 名前:デフォルトの名無しさん [2021/11/23(火) 19:59:41.90 ID:VKZug2mU.net] いまどきC++使ってるのは老害でしょう。 すぐにRustを始めるべきです。
372 名前:ハノン mailto:sage [2021/11/23(火) 20:09:04.33 ID:A++o7U7T.net] あわしろ氏って、もしかして馬鹿ぁ?
373 名前:デフォルトの名無しさん [2021/11/23(火) 21:01:08.57 ID:VKZug2mU.net] 低能が何か申しておりますw
374 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 21:24:52.33 ID:dif3t6ob.net] >>364 俺は調査目的で調べてるだけで、実用的に使うつもりはないからな。
375 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 22:01:53.34 ID:qrGqDm2c.net] >>368 たまに見かける使いこなせなくて脱落したケース?
376 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 22:12:56.79 ID:WEl5Ae/m.net] あわしろって誰?調べても出てこない
377 名前:デフォルトの名無しさん mailto:sage [2021/11/23(火) 23:01:49.38 ID:dif3t6ob.net] >>369 使う必要性を感じない。
378 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 07:30:28.98 ID:bRL60DLP.net] >>368 であれば、批判する資格はないな
379 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 10:47:07.21 ID:vbixrgR4.net] >>372 有る。
380 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 10:49:35.25 ID:kXzWnsgO.net] 仮に泡白という人物が実在したとしても ここで連呼されるのは本人も迷惑してるんじゃないかな
381 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 11:15:10.51 ID:vbixrgR4.net] Ubuntu Linuxや OpenOffice系の洋書の翻訳家に、 「あわしろいくや」という人物がいるようだ。
382 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 11:21:34.63 ID:RpLLJ5lb.net] しかもRustやC++の専門家のようには見えんけども…
383 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 17:09:21.00 ID:5wn/1hS5.net] >>373 CとRustそれぞれでコードを書いてみることをおすすめします 計算量オーダーが変わるアルゴリズムレベルの検討ならともかく コンパイラの最適化でいくらでも性能が変わりうる実装の詳細についてはまず性能測定するのが常識だと思います
384 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 17:29:56.67 ID:mlqzRK
] [ここ壊れてます]
385 名前:jQ.net mailto: リンクリストで頑張るより配列のほうが色々捗る場面も多々あるよな キャッシュが効いてるとこ読むときの速度は目を見張るもんがある ヒープで飛び飛びになったデータ構造はその点で恐ろしく不利 それを知ってる人は実測した結果で語る [] [ここ壊れてます]
386 名前:デフォルトの名無しさん [2021/11/24(水) 19:53:47.71 ID:6QwWetEE.net] 21世紀にもなってC++使ってるのは頭がおかしい。
387 名前:デフォルトの名無しさん [2021/11/24(水) 19:54:39.96 ID:6QwWetEE.net] Linusは20世紀の頃からC++は駄目だと言ってた。 天才。
388 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 22:30:18.26 ID:Vyl+UaHe.net] Rustは言語が汚い。
389 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 22:43:39.16 ID:RtLWv5R+.net] linusのc++否定ってのは当時の実装のバギーさとオブジェクト指向に対する否定だな。 関数型流行ってる今から見ると割と普通のこと言っとるわ。
390 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 23:59:24.30 ID:e1u6MioL.net] >>381 むしろ綺麗な方
391 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 01:15:43.82 ID:/vPuyV+m.net] >>381 言語が汚いってのはよくわからないけど例えばどういうところが汚いと感じたの?
392 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 01:47:48.10 ID:pEcDGUra.net] でもLinkedList版sliceみたいなのって実現できないのかね
393 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 02:58:46.76 ID:6PNOZvLH.net] ここまでのまとめ (1) ほとんどの用途でLinkedListよりVecの方が有用 (2) Rustの標準ライブラリにはLinkedList型もVec型もどちらもある (3) もしLinkedListやVecを使っても実現できないならまずはそのRustコードを示すべき (4) 仮に超レアケースがあったとしてもRustでは自分で自由に必要な型を作ればよい
394 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 07:50:48.33 ID:3Rcu7yrD.net] >>381 アセンブラとチューリングマシン語以外の言語は汚い
395 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 09:50:29.78 ID:r5Heuy4P.net] LLVM最強ですね判ります
396 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 16:04:22.18 ID:S6TYxgmH.net] >>386 嘘を書くな。
397 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 16:33:56.78 ID:sK32tKJd.net] >>389 特に嘘はないと思うけど stdのLinkedListがちょっと融通利かないところはあるけど
398 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 16:34:58.88 ID:ug4Dh0aR.net] >>386 様々な言語の中でRustだけ linked list の任意の要素にO(1)でアクセスできないというのは嘘だった も追加で
399 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 20:15:57.40 ID:SwFLZgNz.net] macro記述と言語がまるで別言語、いちいちウザいアトリビュート。letは固定を意味するのではなく式展開 何種類もある「文字列」、それに生えている似たようで意味が違ういっぱいのfn(これはトレイトのせい) わざと敷居を高くしてるとしか思えん
400 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 20:31:51.42 ID:6PNOZvLH.net] >>392 > letは固定を意味するのではなく式展開 letは常に成功する構造パターンマッチングにすぎないよ if letは成功か失敗か不明な構造パターンマッチング 今どきの言語ならば左辺値にパターンが書けるのが普通 > 何種類もある「文字列」 文字列はヒープにあり伸縮可能なStringとそうでないstrの2種類しかないよ ヒープを意識する言語なら2種類ある あとは文字列の参照として&strがあってその本体はヒープにあろうがなかろうが同じ扱いできるだけ
401 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 20:38:50.41 ID:pEcDGUra.net] CString CStr OsString OsStr
402 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 20:58:33.97 ID:88pS2ZzI.net] >>394 それはRustの文字列ではなく単なるFFI 通常のプログラミングでは登場しない
403 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 21:05:41.06 ID:NJM+Y62L.net] >>391 「任意の」 の定義をしないと無意味な主張
404 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 21:16:25.34 ID:vljrMlfk.net] じゃあ何種類もあるじゃない、全部が汚いことへの言い訳にしか聞こえない
405 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 21:25:33.18 ID:88pS2ZzI.net] まとめ ・どの言語でもリンクリストでk番目を得るにはO(n)かかる ・そのk番目を配列で持てばO(1)だがそれはリンクリストではなく配列アクセスのコスト ・リンクリストのk番目を保持する配列を維持するには削除挿入のたびにO(n)の移動が生じる ・これらは言語に依存しない
406 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 21:33:37.11 ID:/vPuyV+m.net] >>397 言語の汚さというよりもOSなどの環境が抱える複雑さをそのまま見せたらそうなったのでは
407 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 21:38:29.78 ID:beDf3C1p.net] それが低いレイヤーをやるってことだわな。 それを他の言語のせいにするrust野郎はクソってことだよ。
408 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 22:13:10.27 ID:88pS2ZzI.net] 誤解している人が居るようなので正しい情報 ・Rustの通常のプログラミングでCStrやOsStrが出てくることはない ・そこでファイルやディレクトリやソケットを操作してもCStrやOsStrは出てこない ・つまりRustで使う文字列はstrとヒープのStringの2種類しかない ・CStrやOsStrはFFIを書く人のみが用いるのでほとんどの人には無縁
409 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 22:18:29.72 ID:3Rcu7yrD.net] 「通常」の定義は?
410 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 22:30:32.62 ID:6PNOZvLH.net] >>402 Rustで未だ対応していない未知のものが出現した時にその対応する人だけがCStrやOsStrを用いる その時のその人を除き、全ての人はCStrやOsStrなんか知らなくてもRustでプログラミング可能
411 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 23:14:44.56 ID:/vPuyV+m.net] >>401 Pathの操作してるとOsStrは普通に出てくるのでFFIでしか出てこないというのは嘘
412 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 23:16:52.42 ID:/vPuyV+m.net] 他の言語がごまかしている箇所を正確に扱えるのがrustの強みでもありめんどくさいところでもある
413 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 23:45:28.39 ID:sK32tKJd.net] Rust擁護マンでも標準の文字列(String/str)以外がFFIのみというのはさすがに筋悪に見える Rustで標準の文字列をUTF8のバイト配列(ヌル文字終端不採用)としたことによる弊害って側面が割と強い でも他言語みたいにそこしっかりしないとなるとそれはそれでめんどくさいから結局のところトレードオフ でもOsStrめんどいわ
414 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 00:54:57.87 ID:Ye0bskEh.net] 文字列エンコードを規定しないとそれはそれで移植性に問題あるし難しいところ WTF-8なる概念必要になったりとにかくWindowsが悪いという気はする
415 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:23:02.14 ID:FqYYA0QW.net] >>391 嘘を書くな。 正しくは、Rustは配列を使って独自実装しないとO(1)には出来無い事が明らかに成った。 参照だと借用規則で出来なくて、配列の添え字番号だと単なる整数なので借用規則の 適用範囲外だからできる。添え字番号をポインタの代わりに使って、独自に リンクトリストを実装することで初めて、O(1)になる。 しかし、O(1)になっても、「係数」が大きくなり、1アクセスに20クロックくらいかかる。 配列の範囲チェックと、配列アクセスのための乗算と加算が追加で必要になるため。 一方、C、C++、C#、Javaではそんなことしなくても最初からO(1)。
416 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:24:19.18 ID:FqYYA0QW.net] >>398 お前みたいなやつは、一度殴ってやりたい。 匿名掲示板だからと言って、でたらめを書くな!! ばか者!
417 名前:ハノン mailto:sage [2021/11/26(金) 03:25:10.11 ID:xSrpn+m5.net] >>408 C/C++ のリンクリストがどうして O(1) なんですか?
418 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:33:50.05 ID:FqYYA0QW.net] >>398 は、数学できない。 細かい点が全然分かって無い。 リンクリストでは、「k番目にアクセスする」と言っても、次の二種類ある。 1. (乱数などで)整数 k
419 名前:を与えられて、ノードを探す。 この場合、どうしても、O(N)、O(k)の時間がかかる。 2. 既に追加したノードを、もう一度アクセスする。 これには、C、C++、C#、Javは、O(1)しかかからない。 しかも、C、C++だと 1 クロック。 Rustだと配列と添え字番号を使って独自実装しなければ、 基本的にO(N)、O(k)かかる。独自実装した場合、 O(1)ではあるが、20〜50クロックくくらいかかる。 [] [ここ壊れてます]
420 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:34:37.06 ID:FqYYA0QW.net] >>410 >>411 を読め。 俺は正直に言っている。また、数学が昔から良くできるので、間違ってない。
421 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:40:28.33 ID:FqYYA0QW.net] >>411 [補足] 実際、>>257 の独自実装は、Rustでも、任意の場所のノードをO(1)で アクセスできるが、1アクセスあたりに一般的なノードサイズでは 20〜50クロック掛かる。 悪いが、QZが出てくると話がややこしくなる。 かわいそうだが、単刀直入にいえば、QZは頭が良くないので、 レベルが全体に下がってしまう。 ようは、レベルが違う人は、教室を分けないとめちゃくちゃに成る。 レベルというのは熟練しているかどうかではなく、生まれつき決まっていて、 直すことが出来ない。 すまん。
422 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 03:46:37.90 ID:FqYYA0QW.net] >>398 >・どの言語でもリンクリストでk番目を得るにはO(n)かかる これは間違いである事は何でも説明した。例えば>>411 。 >・そのk番目を配列で持てばO(1)だがそれはリンクリストではなく配列アクセスのコスト これも間違いで、C、C++、Java、C#では、配列で持たずに、直接、ポインタや参照 で持っても、O(1)でアクセスできる。 Rustでは、借用規則が邪魔して、複数の読み書き参照を同時に永続的に保持できないので、 「k」のような番号でしか場所を維持できないため、そんな風になってしまうだけ。 だから、配列と番号を組み合わせてやっとO(1)にできる。 C、C++、Java、C#では、ポインタや参照を永続的にいつまでも保持できるので 配列を使わなくても O(1)でアクセスできる。 その際、「シーク」動作は必要ない。つまり、先頭から k 番目までを辿る必要が なく、いきなり、k番目に 1 クロックでアクセスできる。 Rustでは、それが、一般的には出来ない。Rustでも、 局所的に1個のノードだけに限定すれば出来る。
423 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:02:58.56 ID:FqYYA0QW.net] 例えばこういうことだ。 リンクリストに、 ハンバーガー、りんご、みかん、ドーナツ、パイナップル の5つを追加したとする。 C、C++、Java、C#では、追加した時に、どこかの5つの変数にこれらの ポインタを残しておけば、あとから好きなタイミングで、どの 食べ物にも、一瞬でアクセスできる。C、C++では、1クロック。 1番目: ハンバーガー 2番目: りんご 3番目: みかん 4番目: ドーナツ 5番目: パイナップル 3番目のみかんにアクセスするのも、1クロック。 その後に、1番目のハンバーガーにアクセスするのも、1クロック。 その後に、4番目のドーナツにアクセスするのも、1クロック。 例えば、こうだ: LinkedList ll; p1 = ll.append("ハンバーガー"); p2 = ll.append("りんご"); p3 = ll.append("みかん"); p4 = ll.append("ドーナツ"); p5 = ll.append("パイナップル");
424 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:03:19.69 ID:FqYYA0QW.net] >>415 [続き] cout << p3->name; // 1 クロックで3番目のノードのみかんにアクセス。 p3->name="orange"; // 名前を英語に直す。アクセスには1クロックしかかからない。 cout << p1->name; // 1 クロックで1番目のノードのハンバーガーにアクセス。 p1->name="hamburger"; // 名前を英語に直す。アクセスには1クロックしかかからない。 cout << p4->name; // 1 クロックで4番目のノードのドーナツにアクセス。 p4->name="donuts"; // 名前を英語に直す。アクセスには1クロックしかかからない。 書き込みも変更も、アクセスには1クロックずつしか掛からない。 これが、Rustでは借用規則に引っかかるために出来ない。 その結果、標準実装では、k番目のノードに「シーク」する必要があるため、 O(k)や、O(N)の時間が掛かってしまう。 例えば: cout << seek(ll, 3)->name; // O(N)の時間が掛かる!! seek(ll, 3)->name="orange"; // O(N)の時間が掛かる!!
425 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:10:09.81 ID:r6ugNRE0.net] >>411 >2. 既に追加したノードを、もう一度アクセスする。 これカーソルでO(1)でできるって何度も言われてるやんけ 書き換え可能なカーソルを複数持つコードを書くのがめんどくさいってならわかるが
426 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:12:10.51 ID:FqYYA0QW.net] >>
427 名前:416 [補足] cout << aaa; は、分かりにくいが、aaa の内容を表示する、という意味だと思って欲しい。 他の言語だと、print aaa; と書くことが多い。この点 C++ は異質であることは 認める。 [] [ここ壊れてます]
428 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:15:36.11 ID:FqYYA0QW.net] >>417 Rustでは、標準 Cursorでは、読み、書き、削除を出来る参照を同時に持つことは出来ない。 C、C++、Java、C#では、 ll.RemoveAt(p2); // p2 のノードを削除。 もアクセス自体は1クロックで出来るし、今示したコードの好きな場所に 追加しても何の問題も無い。 p2は削除されているからアクセスできなくなるだけで、 他のポインタの値は変更されないので、それ以外は何もしなくても そのままで良い。
429 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:16:36.76 ID:FqYYA0QW.net] >>417 良く確認してくれ。 RustのCursorは、順番に辿ることはできるが、読み込みと書き込みと削除が 出来るタイプの参照を同時に複数記憶することは出来ない。
430 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:18:59.29 ID:r6ugNRE0.net] >>419 標準(std)のLinkedListならそれはそう 前にも言ったような気がするが、 自前で作って内部構造にunsafecellを使えば、 不変参照を複数持っている状態でも書き換えが可能になる 例えば要素の追加時にそういうことをするカーソルを返せばよい 実装がめんどくさすぎるのは認める
431 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 04:19:23.54 ID:FqYYA0QW.net] >>420 もっと言えば、C、C++、Java、C#の LinkedListは、 p2 の直後に「じゃがいも」ノードを追加した後、 p4 の直前に「トマト」ノードを追加するなどと言ったことも、 O(1)で出来る。しかも、O(1)と言っても、極限的に速くて、 C、C++の場合は、アクセスには1クロック。 こういうことが、Rustでは、Cursorを使っても出来ない。