「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」
っていうスレ。
前スレ: 結局C++とRustってどっちが良いの?
https://mevius.5ch.net/test/read.cgi/tech/1677286186/
探検
結局C++とRustってどっちが良いの? 2traits
■ このスレッドは過去ログ倉庫に格納されています
2023/04/02(日) 00:42:57.53ID:W9/nq+tL
527デフォルトの名無しさん
2023/04/24(月) 18:19:00.14ID:3hT7+QpV あと、勘違いしてる人がいるかもしれないので念のため言っておくと、
C++のデストラクタは関数の一種に過ぎないので、デストラクタの呼び出しは、
本質的に関数 call と同じものである。そして、C/C++ の関数 call は
比較的高速であり、簡単な場合であれば数クロックで呼び出せる。
なので、本質的にデストラクタの呼び出しコストは、ほとんど 0 に近くて、
本質的にはデストラクタの中身で処理時間が決まる。
C++のデストラクタは関数の一種に過ぎないので、デストラクタの呼び出しは、
本質的に関数 call と同じものである。そして、C/C++ の関数 call は
比較的高速であり、簡単な場合であれば数クロックで呼び出せる。
なので、本質的にデストラクタの呼び出しコストは、ほとんど 0 に近くて、
本質的にはデストラクタの中身で処理時間が決まる。
528デフォルトの名無しさん
2023/04/24(月) 18:31:14.27ID:7KRWLK/0 >>523
もちろん非同期で例外を使ったら大きく負け
同期でも自分で例外を投げたら負け
余分な見えないコードなどのコストがかかるだけでなく
例外自体の有無が把握しづらくドキュメントとコードのレビューコストがかかる
下から例外が来るのかどうか把握
それら例外を上へもらしてないか把握
必ずエラー値で返すコード規約にして見える化してるところは賢い
もちろん非同期で例外を使ったら大きく負け
同期でも自分で例外を投げたら負け
余分な見えないコードなどのコストがかかるだけでなく
例外自体の有無が把握しづらくドキュメントとコードのレビューコストがかかる
下から例外が来るのかどうか把握
それら例外を上へもらしてないか把握
必ずエラー値で返すコード規約にして見える化してるところは賢い
529デフォルトの名無しさん
2023/04/24(月) 18:33:19.55ID:3hT7+QpV ところで、
Rust で Vec に要素を追加した場合にメモリー不足になったかどうかを検出
するのはどうしたらよいんでしたっけ?
Rust で Vec に要素を追加した場合にメモリー不足になったかどうかを検出
するのはどうしたらよいんでしたっけ?
530デフォルトの名無しさん
2023/04/24(月) 18:41:55.56ID:LQT8UQ2a C++との比較に関係しない質問はこっちで受け付けます
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
531デフォルトの名無しさん
2023/04/24(月) 18:45:07.77ID:md6HjKWe すげーのびてるけど中身のあるレスが一つとしてなかった
さすが隔離スレ
さすが隔離スレ
532デフォルトの名無しさん
2023/04/24(月) 18:57:04.81ID:mMe0a6TH >>526
割り込みやシグナルは例外とは別物
割り込みハンドラやシグナルハンドラが発生したその場で小さい処理でデータを得るか何もせずにフラグを立てる
プログラム本体には影響を与えない
そしてそのフラグなどのチェックはハンドラとは別にプログラム本体のどこかで任意の形で任意のタイミングで自由にチェックする
そこで例外を投げるか否かも自由であり直接関係はない
例外はプログラム本体やライブラリやOSなどが投げる
するとキャッチとの間の関数すべてが飛んでプログラム本体は影響を受ける
割り込みやシグナルは例外とは別物
割り込みハンドラやシグナルハンドラが発生したその場で小さい処理でデータを得るか何もせずにフラグを立てる
プログラム本体には影響を与えない
そしてそのフラグなどのチェックはハンドラとは別にプログラム本体のどこかで任意の形で任意のタイミングで自由にチェックする
そこで例外を投げるか否かも自由であり直接関係はない
例外はプログラム本体やライブラリやOSなどが投げる
するとキャッチとの間の関数すべてが飛んでプログラム本体は影響を受ける
533デフォルトの名無しさん
2023/04/24(月) 19:27:10.65ID:1LccsEhK534デフォルトの名無しさん
2023/04/24(月) 19:36:13.19ID:HpPlDS3N 言語の機能だけが重要ではない
エコシステムとコミュニティが同じくらい大事なんだよ
エコシステムとコミュニティが同じくらい大事なんだよ
535デフォルトの名無しさん
2023/04/24(月) 22:48:09.25ID:7GuNUS74 >>526
そのRust叩きをしている彼がデタラメを言ってる
C++の例外は同期例外なので仮に彼の主張が正しいならばC++もアウトになる
C++の例外は呼び出した関数の中でthrowが投げられてその呼び出し側でのみcatchできる同期例外
関数呼び出しが深くなっても全て同期となる時のみC++は例外をサポートしている
スレッド間など非同期となるときはC++は例外を投げられないのでcatchしてデータとして渡して再びthrowするしかない
そのRust叩きをしている彼がデタラメを言ってる
C++の例外は同期例外なので仮に彼の主張が正しいならばC++もアウトになる
C++の例外は呼び出した関数の中でthrowが投げられてその呼び出し側でのみcatchできる同期例外
関数呼び出しが深くなっても全て同期となる時のみC++は例外をサポートしている
スレッド間など非同期となるときはC++は例外を投げられないのでcatchしてデータとして渡して再びthrowするしかない
536デフォルトの名無しさん
2023/04/24(月) 22:51:49.29ID:7GuNUS74 つづき
そしてC++のような同期例外は例外を廃止することも可能
例外を値として関数からのリターン値の一つにすることで例外を無くせる
これを実際に行なっている言語がGoやRustであって例外を廃止してエラー値の一つとして返している
C++でも自主的に同じことが可能であってコーディング規則により例外を返すことを禁じているところもある
例外を使うべきでない理由が複数あるためだ
そしてC++のような同期例外は例外を廃止することも可能
例外を値として関数からのリターン値の一つにすることで例外を無くせる
これを実際に行なっている言語がGoやRustであって例外を廃止してエラー値の一つとして返している
C++でも自主的に同じことが可能であってコーディング規則により例外を返すことを禁じているところもある
例外を使うべきでない理由が複数あるためだ
537デフォルトの名無しさん
2023/04/25(火) 04:31:54.40ID:ICFLZD9/ でも、どちらも一長一短があり、好みの差が出て来そうだ。
538デフォルトの名無しさん
2023/04/25(火) 07:01:02.99ID:EHeneqRq C++で例外を使うデメリット
・値返しの時よりもコードサイズが増える
・値返しの時よりも実行速度が遅くなる
・どちらもRAIIに基づく自動デストラクタは通過関数で呼ばれるが、それ以外で何かしてると例外時にメモリリークする
・各通過関数で例外が通過するのかどうかがわからず、関連する全てのコードを追う必要があり保守性が悪い
・例外を誰もcatchしない処理忘れが起きやすい
など多数
・値返しの時よりもコードサイズが増える
・値返しの時よりも実行速度が遅くなる
・どちらもRAIIに基づく自動デストラクタは通過関数で呼ばれるが、それ以外で何かしてると例外時にメモリリークする
・各通過関数で例外が通過するのかどうかがわからず、関連する全てのコードを追う必要があり保守性が悪い
・例外を誰もcatchしない処理忘れが起きやすい
など多数
539デフォルトの名無しさん
2023/04/25(火) 07:42:43.52ID:S/F8mIrU 複おじ頻出単語「デタラメ」
540デフォルトの名無しさん
2023/04/25(火) 08:52:43.77ID:MJkz9zZx C++の例外の利用を禁止しているプロジェクトも多いし
C++の例外は要らない子
C++の例外は要らない子
541デフォルトの名無しさん
2023/04/25(火) 09:25:09.15ID:jEavB9HA Nim 派の漏れだが
おまいらが執拗に Rust 薦めるから
使っても居ないのに批判はするべきでないと思って
Rust 使って観たがやはり君らの言う通り面倒な言語だ
C/C++ に対するメリットが面倒さを上回っていない
Nim に戻るわ
おまいらが執拗に Rust 薦めるから
使っても居ないのに批判はするべきでないと思って
Rust 使って観たがやはり君らの言う通り面倒な言語だ
C/C++ に対するメリットが面倒さを上回っていない
Nim に戻るわ
542デフォルトの名無しさん
2023/04/25(火) 09:35:36.87ID:ORuH1n7Y 面倒と言ってるのは使いこなせていないダメな連中ばかりな点が面白い
どの言語でも使いこなせるようになった時点同士で比較しないと意味がない
Rustは少なくともC++よりは開発効率も保守性も良く手間も時間も節約になる
どの言語でも使いこなせるようになった時点同士で比較しないと意味がない
Rustは少なくともC++よりは開発効率も保守性も良く手間も時間も節約になる
543デフォルトの名無しさん
2023/04/25(火) 09:36:03.71ID:jEavB9HA >>529
cargo で build 中に HDD 容量不足になっても可笑しな動きするぞω
cargo で build 中に HDD 容量不足になっても可笑しな動きするぞω
544デフォルトの名無しさん
2023/04/25(火) 09:49:25.88ID:jEavB9HA545デフォルトの名無しさん
2023/04/25(火) 09:58:33.05ID:9wDWD7Sh ストレージは事前に確保しとけよw
546デフォルトの名無しさん
2023/04/25(火) 09:59:52.69ID:kFjsyCNQ C++はコンパイル時点でエラーを出してくれない事項が多くて、言語仕様により静的解析ツールでも限界があるため、コードレビューを増やして、さらに実行して動的解析やデバッグツールと、手間暇かかってたことが、Rustでコンパイル通すだけで済むようになったのがうれしいです
547デフォルトの名無しさん
2023/04/25(火) 10:08:12.19ID:tuLJpxi/ 良くも悪くもRustはそれなりに受け入れられるだろうね。
ここ数年の流れはJavaの出だしの頃に非常に似ている。
Rust認定試験全盛になり、Rust採用枠が雨後のタケノコの如く大量に出来て、
Rustリプレースの経済的嵐が来るね。
そしてやがてはJavaやPHPやVBみたいにドカタ言語だと罵られる。
最期は銀行のシステムにも使われて不祥事起こすニュースまで見える。
ここ数年の流れはJavaの出だしの頃に非常に似ている。
Rust認定試験全盛になり、Rust採用枠が雨後のタケノコの如く大量に出来て、
Rustリプレースの経済的嵐が来るね。
そしてやがてはJavaやPHPやVBみたいにドカタ言語だと罵られる。
最期は銀行のシステムにも使われて不祥事起こすニュースまで見える。
548デフォルトの名無しさん
2023/04/25(火) 10:25:56.34ID:JrTTHQQr 5年先をいってるアメリカの状況を見てくるといいよ
549デフォルトの名無しさん
2023/04/25(火) 10:57:04.79ID:2yJ/wM2b 俺もRustに手を出したばかりの頃は
難しい、面倒だ、ウザい、と思っていた時期もあったよ
しかしそれは単にまだ無知で慣れていなくて色んなやり方を知らない超初心者なだけだったな
だから、難しい、面倒だ、ウザい、と書き込みしてる人のアドバイスは全く役に立たないよ
難しい、面倒だ、ウザい、と思っていた時期もあったよ
しかしそれは単にまだ無知で慣れていなくて色んなやり方を知らない超初心者なだけだったな
だから、難しい、面倒だ、ウザい、と書き込みしてる人のアドバイスは全く役に立たないよ
550デフォルトの名無しさん
2023/04/25(火) 11:00:14.12ID:SLebcTTI なんか
・良い物は自分らで書く
・クソどうでもいい物は他人に書かせる
という前提で話を進めている人がいる気がする
標準ライブラリで書け勢というのも他人に書かせた物を利用しない勢だよな
・良い物は自分らで書く
・クソどうでもいい物は他人に書かせる
という前提で話を進めている人がいる気がする
標準ライブラリで書け勢というのも他人に書かせた物を利用しない勢だよな
551デフォルトの名無しさん
2023/04/25(火) 11:10:21.23ID:TXoqgMbP 標準ライブラリで書けってのはあれかい、やたらunsafeで書くなってやつかい(ひっかきまわし
552デフォルトの名無しさん
2023/04/25(火) 11:16:45.20ID:S/F8mIrU 真面目にRust使ってる人はrustcにマウント取られるので忙しいのです
ここでrustcの真似っこしてC++erにマウント取ってる人は、rustcにマウント取られたまま逃げて停滞している人なのです
ここでrustcの真似っこしてC++erにマウント取ってる人は、rustcにマウント取られたまま逃げて停滞している人なのです
553デフォルトの名無しさん
2023/04/25(火) 12:09:33.28ID:2Q7bhLWK >>549
お前は超初心者なのでは?
お前は超初心者なのでは?
554デフォルトの名無しさん
2023/04/25(火) 12:28:20.73ID:o3HFo3jF Rustのshared XOR mutableがウザくないというのは信じられん。
厳密性の観点から重要というのは理解できるが。
厳密性の観点から重要というのは理解できるが。
555デフォルトの名無しさん
2023/04/25(火) 12:29:59.91ID:F5kqvgZa >>550
どゆこと?
どゆこと?
556デフォルトの名無しさん
2023/04/25(火) 13:56:36.59ID:ydyNsZFf >>554
安全に書くのってこんなにウザかったんだと実感する
安全に書くのってこんなにウザかったんだと実感する
557デフォルトの名無しさん
2023/04/25(火) 16:23:28.59ID:RcxC+Qut558デフォルトの名無しさん
2023/04/25(火) 17:27:39.88ID:TXoqgMbP めんどくさい感が楽しいのは、C++で十分なんだよなあ (といいつつ、この点は互角
559デフォルトの名無しさん
2023/04/25(火) 17:40:59.19ID:92EMGOvn lifetimeや所有権はうざいくらい
しつこく警告してコンパイル通さないのに
unsafeはなんぼ書いてもお咎め無しなのも面白い仕様な
しつこく警告してコンパイル通さないのに
unsafeはなんぼ書いてもお咎め無しなのも面白い仕様な
560デフォルトの名無しさん
2023/04/25(火) 17:58:10.72ID:SLebcTTI561デフォルトの名無しさん
2023/04/25(火) 18:06:32.83ID://U1oA7y >>547
>ここ数年の流れはJavaの出だしの頃に非常に似ている。
よく分からない。当時は本屋にJavaが並んだなと思ったら、既に大人気
状態だった気がする。人気と本のどちらが先に出たかの前後関係は良く知らない。
>ここ数年の流れはJavaの出だしの頃に非常に似ている。
よく分からない。当時は本屋にJavaが並んだなと思ったら、既に大人気
状態だった気がする。人気と本のどちらが先に出たかの前後関係は良く知らない。
562デフォルトの名無しさん
2023/04/25(火) 18:23:59.84ID:sY5ul2B3 >>559
lifetimeや所有権がうざいって、
あなたC++でも正しいコードを書けていないでしょ
所有権はC++もRustも同じ
lifetimeはC++で明記されないけど満たすように書かないとダングリング
lifetimeや所有権がうざいって、
あなたC++でも正しいコードを書けていないでしょ
所有権はC++もRustも同じ
lifetimeはC++で明記されないけど満たすように書かないとダングリング
563デフォルトの名無しさん
2023/04/25(火) 18:46:54.32ID:S/F8mIrU https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fc5a23e24fd46feb0a4388c2f0161caf
はーうざいうざい
修正方法分かったけどあーうざいうざい
はーうざいうざい
修正方法分かったけどあーうざいうざい
564デフォルトの名無しさん
2023/04/25(火) 19:38:05.27ID:aqZr5Pum lnked listなんてアクセス遅すぎて
ほとんどの用途はベクターの方が結局速い
残りの用途はバイナリーツリーなどになるが車輪の再発明してもよいことはなくライブラリを使うべき
ほとんどの用途はベクターの方が結局速い
残りの用途はバイナリーツリーなどになるが車輪の再発明してもよいことはなくライブラリを使うべき
565デフォルトの名無しさん
2023/04/25(火) 19:40:54.10ID://U1oA7y566デフォルトの名無しさん
2023/04/25(火) 19:57:48.42ID:Dk+hkiE7 リンクリストはマジ遅い
値の読み書きも挿入も削除もまずその場所を見つけたどるのにO(n)かかってしまう
値の読み書きも挿入も削除もまずその場所を見つけたどるのにO(n)かかってしまう
567デフォルトの名無しさん
2023/04/25(火) 20:54:35.52ID:XIw07JKL >>563
そのエラーを起こしているバグは所有権もライフタイムも関係ない
ロックをつかんだまま更にそのロックをつかもうとしている一般的なバグ
ブロックを分ければロックが解放されて解決する
初心者が一度は通る道だが二度目以降は一瞬で対応できるようになるだろう
ちなみにそのコードに限れば最初からmutロックを得る方法でも解決できる
そのエラーを起こしているバグは所有権もライフタイムも関係ない
ロックをつかんだまま更にそのロックをつかもうとしている一般的なバグ
ブロックを分ければロックが解放されて解決する
初心者が一度は通る道だが二度目以降は一瞬で対応できるようになるだろう
ちなみにそのコードに限れば最初からmutロックを得る方法でも解決できる
568デフォルトの名無しさん
2023/04/25(火) 21:03:25.18ID:XIw07JKL569デフォルトの名無しさん
2023/04/25(火) 21:07:31.77ID:XIw07JKL570デフォルトの名無しさん
2023/04/25(火) 22:09:05.21ID:FSwGLA9a 563がRcとRefCell使ってるのはgitのバージョン管理ツリーみたいなデータ構造を作りたかったのかな
set_lastで要素を追加するlistの参照に敢えてmutを付けないあたりに強いこだわりを感じる力作
set_lastで要素を追加するlistの参照に敢えてmutを付けないあたりに強いこだわりを感じる力作
571デフォルトの名無しさん
2023/04/25(火) 22:59:52.83ID:ith9obtO 力作でもなんでもなくRcとRefCellの基本にすぎないな
もちろんRcとRefCellを使わずにmutの普通のリンクリストも作れる
一長一短あるので用途に合わせて使い分け
もちろんRcとRefCellを使わずにmutの普通のリンクリストも作れる
一長一短あるので用途に合わせて使い分け
572デフォルトの名無しさん
2023/04/26(水) 00:23:36.32ID:8XaB5QqW 単純にノード単位で共有する感じか
なんか逆方向に枝分かれしながら伸ばしてツリー状のグラフを作るイメージをしてしまった
なんか逆方向に枝分かれしながら伸ばしてツリー状のグラフを作るイメージをしてしまった
573デフォルトの名無しさん
2023/04/26(水) 01:08:26.72ID:N0yJtyL8 >>567
めちゃくちゃいい加減なこと言ってんなw
めちゃくちゃいい加減なこと言ってんなw
574デフォルトの名無しさん
2023/04/26(水) 01:10:35.86ID:N0yJtyL8575デフォルトの名無しさん
2023/04/26(水) 01:21:03.37ID:1VlSMqUT LinkedListは要素の挿入や削除が頻繁に行われる用途で使うものだと思うけど
vectorはそんな用途には向いていない
vectorはそんな用途には向いていない
576デフォルトの名無しさん
2023/04/26(水) 01:30:48.26ID:N0yJtyL8 LinkedListでVectorより効率的に挿入や削除を行うためには
どこに挿入するかどの要素を削除するかをピンポイントで事前に把握できてる必要があるよ
どこに挿入するかどの要素を削除するかをピンポイントで事前に把握できてる必要があるよ
577デフォルトの名無しさん
2023/04/26(水) 01:45:09.49ID:xAlX+8Be RustにもSTLのstd::listみたいなのくらいあるやろ?
自作して何がうれしいのかな?
自作して何がうれしいのかな?
578デフォルトの名無しさん
2023/04/26(水) 01:48:47.01ID:1Uz+jjx7 >>575
意外に思うかもしれないけど
リンクリストは挿入削除の位置までリンクをたどるコストが実は非常に高い
たどった分の個数の読み出しが発生しているためベクター利用でシフト挿入削除の方が速いこともある
理由としては読み出し発生の個数は平均して両者でほぼ同じだがシーケンシャルなベクター利用が速くて勝ち
ベクター利用はそこにシフト書き込みが発生するけど御存知のようにCPUサイクルは読み込みサイクルと比べて書き込みサイクルが超高速
意外に思うかもしれないけど
リンクリストは挿入削除の位置までリンクをたどるコストが実は非常に高い
たどった分の個数の読み出しが発生しているためベクター利用でシフト挿入削除の方が速いこともある
理由としては読み出し発生の個数は平均して両者でほぼ同じだがシーケンシャルなベクター利用が速くて勝ち
ベクター利用はそこにシフト書き込みが発生するけど御存知のようにCPUサイクルは読み込みサイクルと比べて書き込みサイクルが超高速
579デフォルトの名無しさん
2023/04/26(水) 01:50:34.41ID:N0yJtyL8 LinkedListを自作するとRustのOwnershipルール/Rerefernceルールや
Rc<RefCell<T>>みたいな頻出パターンを苦労しながら学べる(らしい)
まあ学べてない人もいるけど
Rc<RefCell<T>>みたいな頻出パターンを苦労しながら学べる(らしい)
まあ学べてない人もいるけど
580デフォルトの名無しさん
2023/04/26(水) 01:53:24.45ID:xAlX+8Be >>579
コンパイラとの取っ組み合い用かw くだらねー
コンパイラとの取っ組み合い用かw くだらねー
581デフォルトの名無しさん
2023/04/26(水) 02:12:38.44ID:QEFRGsvT >>573
その>>567のアドバイス通り
ブロックを終わらせたらborrow()のロックが解放されて動くようになったよ
if let Some(ref next) = list.0.borrow().next {
set_last(next, value);
return;
}
list.0.borrow_mut().value = value;
結局アドバイス二つ目のborrow_mut()だけを最初から使う方法にしたよ
let mut node = list.0.borrow_mut();
if let Some(ref next) = node.next {
set_last(next, value);
} else {
node.value = value;
}
その>>567のアドバイス通り
ブロックを終わらせたらborrow()のロックが解放されて動くようになったよ
if let Some(ref next) = list.0.borrow().next {
set_last(next, value);
return;
}
list.0.borrow_mut().value = value;
結局アドバイス二つ目のborrow_mut()だけを最初から使う方法にしたよ
let mut node = list.0.borrow_mut();
if let Some(ref next) = node.next {
set_last(next, value);
} else {
node.value = value;
}
582デフォルトの名無しさん
2023/04/26(水) 02:20:44.73ID:V27dNYw1 参照は適当なところで死んでくれるのにRefはそうじゃないのがだるいって言ってんの
583デフォルトの名無しさん
2023/04/26(水) 02:37:31.30ID:wGFuhVl0 そんな事例あるか?
Hoge(ref x) = y と
Hoge(x) = &y は完全に同じだろ
複数マッチングなどrefしか使えないこともあるから参照はrefで受けるのが好ましい
Hoge(ref x) = y と
Hoge(x) = &y は完全に同じだろ
複数マッチングなどrefしか使えないこともあるから参照はrefで受けるのが好ましい
584デフォルトの名無しさん
2023/04/26(水) 02:54:29.50ID:V27dNYw1 refじゃなくてRefだよ
585デフォルトの名無しさん
2023/04/26(水) 03:11:17.63ID:EoYJiu34 RefCellが返すRefやRefMutはロックガードの一種
他のロックを使うときと同じ利用方法でOK
一時利用が終わるかブロックを抜ければ自動解放され快適
他のロックを使うときと同じ利用方法でOK
一時利用が終わるかブロックを抜ければ自動解放され快適
586デフォルトの名無しさん
2023/04/26(水) 03:13:46.65ID:N0yJtyL8587デフォルトの名無しさん
2023/04/26(水) 03:33:09.04ID:7yfVI/A5 >>566
それはあなたの使い方が間違っているから。
576, 578 の人も同様。
LinkedListでは、場所のラベルとして、index ではなく pointer を使わなければならない。
それを守ればとても高速。
それはあなたの使い方が間違っているから。
576, 578 の人も同様。
LinkedListでは、場所のラベルとして、index ではなく pointer を使わなければならない。
それを守ればとても高速。
588デフォルトの名無しさん
2023/04/26(水) 03:37:05.06ID:m5i6OxT0 >>586
RefCellはmultiple readers or single writerのロックをして参照や可変参照を借用できる型
RwLockと同じように読み出しは複数可だが書き込みは単独独占となる
同じようにロックガードが消えればロックは自動解放される
ただしRwLockとは異なりスレッド間では使えない
RefCellはmultiple readers or single writerのロックをして参照や可変参照を借用できる型
RwLockと同じように読み出しは複数可だが書き込みは単独独占となる
同じようにロックガードが消えればロックは自動解放される
ただしRwLockとは異なりスレッド間では使えない
589デフォルトの名無しさん
2023/04/26(水) 04:05:00.19ID:RAzLC92N590デフォルトの名無しさん
2023/04/26(水) 05:12:35.92ID:7yfVI/A5 >>589
全然違います。
特定の要素を覚えるのはアドレス(ポインタ)を番号として用います。
また、そこから隣に移動したい場合は、右隣は、pNextで、左隣は、pPrev
辿っていくことが出来ます。これらはそれぞれ1クロックしかかからないので、
idx++ と同じ速度なので、効率は最高に良いです。
ほとんどの場合、ポインタを覚えるのに別の集合は必要ありません。
もし、必要な場合は、配列の場合でも index を覚えるために別の集合が
必要になるような場合です。
しかし、それは稀です。なので、LinkedListの場合も稀です。
全然違います。
特定の要素を覚えるのはアドレス(ポインタ)を番号として用います。
また、そこから隣に移動したい場合は、右隣は、pNextで、左隣は、pPrev
辿っていくことが出来ます。これらはそれぞれ1クロックしかかからないので、
idx++ と同じ速度なので、効率は最高に良いです。
ほとんどの場合、ポインタを覚えるのに別の集合は必要ありません。
もし、必要な場合は、配列の場合でも index を覚えるために別の集合が
必要になるような場合です。
しかし、それは稀です。なので、LinkedListの場合も稀です。
591デフォルトの名無しさん
2023/04/26(水) 06:31:44.27ID:nP514kb2 >>590
他の方々はそのような特殊な使い方のみを前提としていない比較だと思いますが、その特殊な場合で比較してみましょう。
前後の要素へポインタを移すために、ptr++とptr--だけで済むのは配列やvectorです。
実際には最大アドレスまたは最小アドレスとの比較も必要ですが、この値もレジスタに持っておくので、比較と増減で2サイクルで済みます。
一方でlinked listの場合、前後の要素へポインタを移すためには、ptr = ptr->nextとptr = ptr->prevそして0との比較になります。
キャシュがヒットしなかったとして、メインメモリから読み出すとすると、100~数百サイクルかかります。
もちろんキャッシュに乗ればマシになりますが、linked listは予想ができません。
このようにポインタの移動だけでも、メモリアクセスが生じるlinked listは非常に不利です。
各要素の内容自体の読み込みは、どちらも同じなりそうですが、少しだけ違ってきます。
vectorならば次々とシーケンシャル読み出しとなり、確実にL1キャッシュに乗りますので、読み出しは4クロック程度で済みます。
linked listはnext/prevを読み出すときに多大なコストを払っているので、内容自体の読み込みはキャッシュに乗ってるでしょう。
しかし、キャッシュに乗ってもnext/prevのサイズ分だけ早くキャッシュから外れるため、やや不利となります。
したがって、前後の要素へのポインタの移動でも、要素の内容読み出しでも、vectorが速くなり、linked listは遅くなります。
他の方々はそのような特殊な使い方のみを前提としていない比較だと思いますが、その特殊な場合で比較してみましょう。
前後の要素へポインタを移すために、ptr++とptr--だけで済むのは配列やvectorです。
実際には最大アドレスまたは最小アドレスとの比較も必要ですが、この値もレジスタに持っておくので、比較と増減で2サイクルで済みます。
一方でlinked listの場合、前後の要素へポインタを移すためには、ptr = ptr->nextとptr = ptr->prevそして0との比較になります。
キャシュがヒットしなかったとして、メインメモリから読み出すとすると、100~数百サイクルかかります。
もちろんキャッシュに乗ればマシになりますが、linked listは予想ができません。
このようにポインタの移動だけでも、メモリアクセスが生じるlinked listは非常に不利です。
各要素の内容自体の読み込みは、どちらも同じなりそうですが、少しだけ違ってきます。
vectorならば次々とシーケンシャル読み出しとなり、確実にL1キャッシュに乗りますので、読み出しは4クロック程度で済みます。
linked listはnext/prevを読み出すときに多大なコストを払っているので、内容自体の読み込みはキャッシュに乗ってるでしょう。
しかし、キャッシュに乗ってもnext/prevのサイズ分だけ早くキャッシュから外れるため、やや不利となります。
したがって、前後の要素へのポインタの移動でも、要素の内容読み出しでも、vectorが速くなり、linked listは遅くなります。
592デフォルトの名無しさん
2023/04/26(水) 08:16:17.35ID:090dM5ZS またその話...
状況次第なので
二人ともLinkedHashMapの場合で持論を展開してください
状況次第なので
二人ともLinkedHashMapの場合で持論を展開してください
593デフォルトの名無しさん
2023/04/26(水) 08:21:46.43ID:e279LTxP なんでも測ってみないとダメってばーちゃんが言ってた
勉強になるからいいけどw
勉強になるからいいけどw
594デフォルトの名無しさん
2023/04/26(水) 09:51:14.24ID:zYbSfnJu コンパイラ通せば終わり(キリッ)っていうバカを助長させてるだけだな。
595デフォルトの名無しさん
2023/04/26(水) 11:35:48.60ID:N7+hGpB4 自己紹介乙
596デフォルトの名無しさん
2023/04/26(水) 12:00:07.23ID:1VlSMqUT597デフォルトの名無しさん
2023/04/26(水) 12:25:39.79ID:SBWyUq0g >>594
バッドノウハウが溜まればどのみちコーティング規約とlintが必要になる。
バッドノウハウが溜まればどのみちコーティング規約とlintが必要になる。
598デフォルトの名無しさん
2023/04/26(水) 12:41:46.92ID:mk8XnWac599デフォルトの名無しさん
2023/04/26(水) 13:29:30.45ID:8XaB5QqW LinkedListはリストの先頭とか要素自身のインデクスを知らなくても前後に要素を差し込んだり自身を削除したりできるから
サイズが不定だったり大きかったりする要素を数珠つなぎにする場合に使える
Linuxカーネルのページ管理でそういうことしてたと思う(今現在は知らないけど)
小さい要素を大量に保持するなら挿入、削除があってもキャッシュしやすいvectorが強そう
サイズが不定だったり大きかったりする要素を数珠つなぎにする場合に使える
Linuxカーネルのページ管理でそういうことしてたと思う(今現在は知らないけど)
小さい要素を大量に保持するなら挿入、削除があってもキャッシュしやすいvectorが強そう
600デフォルトの名無しさん
2023/04/26(水) 16:36:01.06ID:W7riOQ8m >>591
嘘か書かないで。
嘘か書かないで。
601デフォルトの名無しさん
2023/04/26(水) 16:37:03.22ID:W7riOQ8m 591の人はイマジネーションが不足している。
602デフォルトの名無しさん
2023/04/26(水) 16:37:48.41ID:W7riOQ8m 591の人を始め、ここの人には、図を書いて考えてみることをお勧めします。
603デフォルトの名無しさん
2023/04/26(水) 16:47:25.16ID:e279LTxP 小学校の算数かよ
ごめん俺、小学校の算数躓いた勢だったわww
ちょっと算数系の学習障害 はいってるんかもしれん
ごめん俺、小学校の算数躓いた勢だったわww
ちょっと算数系の学習障害 はいってるんかもしれん
604デフォルトの名無しさん
2023/04/26(水) 16:48:15.43ID:9EDgaMeS 月面着陸船が落っこちたそうだが
Rustで書いてれば成功したはず
それにしてもローバーは活躍出来ず流産乙
Rustで書いてれば成功したはず
それにしてもローバーは活躍出来ず流産乙
605デフォルトの名無しさん
2023/04/26(水) 17:01:55.60ID:2Da7m8zO >Rustで書いてれば成功したはず
↑この発想がそのまま↓なんだと言う自覚ゼロ
>コンパイラ通せば終わり(キリッ)っていうバカ
↑この発想がそのまま↓なんだと言う自覚ゼロ
>コンパイラ通せば終わり(キリッ)っていうバカ
606デフォルトの名無しさん
2023/04/26(水) 17:17:57.85ID:D8UGhnWi >>600
嘘書かないで
嘘書かないで
607デフォルトの名無しさん
2023/04/26(水) 18:28:24.85ID:FJ6FgKNy608デフォルトの名無しさん
2023/04/26(水) 18:39:00.36ID:/TEdGcy5 >>607
最後、頭の良さが無い人に教えることは不可能。キリが無いから。
最後、頭の良さが無い人に教えることは不可能。キリが無いから。
609デフォルトの名無しさん
2023/04/26(水) 18:42:01.34ID:/TEdGcy5 言葉ではなく、脳内に画像的なイメージを描かないと駄目ですよ。
全然それが出来てない。
全然それが出来てない。
610デフォルトの名無しさん
2023/04/26(水) 19:01:03.33ID:4J8YauGV この人はvector内にガチのclassやstruct入れてるんだな
611デフォルトの名無しさん
2023/04/26(水) 19:04:57.37ID:N0yJtyL8 >>596
便利だと思うのは自由だけど
頭から順番にイテレートしてから挿入・削除するような使い方だと
Cache Localityの違いによってVectorより性能が劣る
性能が重要ならLinkedListは挿入・削除時にイテレートが必要ないようにして使う
HashMapとLinkedListを組み合わせたLRUキャッシュとかね
便利だと思うのは自由だけど
頭から順番にイテレートしてから挿入・削除するような使い方だと
Cache Localityの違いによってVectorより性能が劣る
性能が重要ならLinkedListは挿入・削除時にイテレートが必要ないようにして使う
HashMapとLinkedListを組み合わせたLRUキャッシュとかね
612デフォルトの名無しさん
2023/04/26(水) 19:11:34.98ID:4J8YauGV613デフォルトの名無しさん
2023/04/26(水) 19:12:21.18ID:4J8YauGV vectorが は間違えて入ってる
614デフォルトの名無しさん
2023/04/26(水) 19:38:13.57ID:qH1OmRtr >>612
メモリキャッシュ自体はヒープもスタックも関係ないが
もちろんスタック上は常にキャッシュに載るから
上限値が決まっているならば全てスタック上に載せたほうが有利
ヒープは確保と解放のコストもかかるから大きく不利
そのためベクター型でもスタックを利用するものを使うとさらに速くなる
例えばRustはスタックをなるべく多用するために3種類のベクター型が使い分けられている
(1) ArrayVec は上限値を定めてスタックのみを使うベクター型
(2) SmallVec は上限値を定めてその範囲内ならスタックのみを使って超えたらヒープを使うベクター型
(3) Vec はヒープを使うベクター型
それぞれコストとわずかに特性が異なる
メモリキャッシュ自体はヒープもスタックも関係ないが
もちろんスタック上は常にキャッシュに載るから
上限値が決まっているならば全てスタック上に載せたほうが有利
ヒープは確保と解放のコストもかかるから大きく不利
そのためベクター型でもスタックを利用するものを使うとさらに速くなる
例えばRustはスタックをなるべく多用するために3種類のベクター型が使い分けられている
(1) ArrayVec は上限値を定めてスタックのみを使うベクター型
(2) SmallVec は上限値を定めてその範囲内ならスタックのみを使って超えたらヒープを使うベクター型
(3) Vec はヒープを使うベクター型
それぞれコストとわずかに特性が異なる
615デフォルトの名無しさん
2023/04/26(水) 20:22:03.82ID:Pd8SmuYa https://ideone.com/hqXsfu
シャッフルされた数列を昇順にinsertした
{
std::vector<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
{
std::list<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
シャッフルされた数列を昇順にinsertした
{
std::vector<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
{
std::list<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
616デフォルトの名無しさん
2023/04/26(水) 20:41:37.78ID:4J8YauGV617デフォルトの名無しさん
2023/04/26(水) 20:45:35.28ID:4J8YauGV 要素としてintが並んでるだけの実際にはないようなパターンの話をされても困るだろ
何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
618デフォルトの名無しさん
2023/04/26(水) 20:47:03.66ID:4J8YauGV 前にrustスレをずっと荒らしてたおじいさんなのかな?
619デフォルトの名無しさん
2023/04/26(水) 20:51:22.56ID:gAezaDDb >>616
大きなデータだとそういう二段階データ構造にする場合もあるというだけだろう
例えばソートは実体を移動させるよりもインデックスだけ移動させる新たなベクターを設ける
しかしその元の実体もベクターに格納したほうが有利なことが多い
ヒープに乱雑に格納するケースはかなり限られてくる
大きなデータだとそういう二段階データ構造にする場合もあるというだけだろう
例えばソートは実体を移動させるよりもインデックスだけ移動させる新たなベクターを設ける
しかしその元の実体もベクターに格納したほうが有利なことが多い
ヒープに乱雑に格納するケースはかなり限られてくる
620デフォルトの名無しさん
2023/04/26(水) 20:56:32.56ID:G4JVGBup621デフォルトの名無しさん
2023/04/26(水) 20:57:54.91ID:4J8YauGV 限られてはいないだろ
インサート、デリートを乱雑に繰り返して格納するケースだらけだろ
普通に要素数が分からないし、生成時期も分からないものを突っ込むことが多いんだから
インサート、デリートを乱雑に繰り返して格納するケースだらけだろ
普通に要素数が分からないし、生成時期も分からないものを突っ込むことが多いんだから
622デフォルトの名無しさん
2023/04/26(水) 20:59:39.02ID:xAlX+8Be623デフォルトの名無しさん
2023/04/26(水) 21:01:40.35ID:4J8YauGV アプリ作ったことないの?
624デフォルトの名無しさん
2023/04/26(水) 21:01:40.98ID:NzJ1LltZ625デフォルトの名無しさん
2023/04/26(水) 21:02:25.41ID:4J8YauGV >>624
intのvector比べて何になるんだよ
intのvector比べて何になるんだよ
626デフォルトの名無しさん
2023/04/26(水) 21:03:19.22ID:yGAW9BPT intじゃなくて256byteぐらいのデータでやってみると逆転したり
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★6 [樽悶★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★7 [樽悶★]
- 【速報】公然わいせつの疑いで逮捕・送検・略式起訴のAぇ! group 草間リチャード敬太メンバー 脱退を発表 「心の病の療養」に専念 [Ailuropoda melanoleuca★]
- 小野田紀美 経済安保相「悪いことをする外国人、日本にいない状況つくる」 [Hitzeschleier★]
- 中国国際航空が日本便を減便へ、春節休みも SNSでは投稿相次ぐ [七波羅探題★]
- 【🐼🇨🇳】「高市総理VS中国」で日本からパンダはゼロに? 上野動物園「パンダ返還期限」まであと4カ月…★2 [BFU★]
- 【高市悲報】中国の日本料理店「いつもは満席ですがガラガラです。あとどれだけ待てばいいのかな…😢」 [931948549]
- 恐ろしい😈のちゅちょちゅちょ・ちぇびるのお🏡
- 【実況】博衣こよりのえちえち声遊楽プロジェクト 共同研究第三弾🧪
- 高市早苗が恐ろしいのは「起こらなくて良かったはずの事態を引き起こしてる」ってところだよな? [592058334]
- 【悲報】立憲岡田「間違った答弁をした高市総理に問題がある」→愛国者ブチギレ炎上 [834922174]
- 珍🏡珍
