「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
499デフォルトの名無しさん
2023/04/24(月) 14:44:47.56ID:8iJzzYCL500デフォルトの名無しさん
2023/04/24(月) 14:53:54.93ID:ndm5HuNo Rustは余り普及しないのでは。
501デフォルトの名無しさん
2023/04/24(月) 14:59:09.48ID:RJ/B3o+B502デフォルトの名無しさん
2023/04/24(月) 15:09:12.38ID:OTXlubpx おいおい馬鹿はお前w
レイヤが異なろうがどんなに泥臭かろうがシステム言語の宿命
Rustはシステムプログラミングの何たるかを言語設計の初期段階で考慮していない
CPU例外(≒非同期例外)を構造的にキャッチ出来ない出来損ないシステム言語w
レイヤが異なろうがどんなに泥臭かろうがシステム言語の宿命
Rustはシステムプログラミングの何たるかを言語設計の初期段階で考慮していない
CPU例外(≒非同期例外)を構造的にキャッチ出来ない出来損ないシステム言語w
503デフォルトの名無しさん
2023/04/24(月) 15:28:07.95ID:N3ScgGCG >>502
RustはCPU例外も割り込みも扱えます
Rustは組み込み用途やOS作成などシステムプログラミングにも使えるように設計されています
Rust(やGoなどの言語)がエラーハンドリングの例外機構を非効率なものとして排除していることとは全く無関係です
RustはCPU例外も割り込みも扱えます
Rustは組み込み用途やOS作成などシステムプログラミングにも使えるように設計されています
Rust(やGoなどの言語)がエラーハンドリングの例外機構を非効率なものとして排除していることとは全く無関係です
504デフォルトの名無しさん
2023/04/24(月) 15:31:17.42ID:RVkZAaib Rustは設計段階ではシステム言語のつもりじゃなかったのでは?
言語構文で非同期例外を扱えないのは野暮ったいし
言語構文で非同期例外を扱えないのは野暮ったいし
505デフォルトの名無しさん
2023/04/24(月) 15:40:24.08ID:YPGUiUuq >>503 RustはCPU例外も割り込みも扱えます... エラーハンドリングの例外機構を非効率なもの
まあPythonですら扱えます、と言うだろうし、非効率ってw?
なんか色々と498が意味するところの理解が追いつかないようだね
講釈するつもりはないから自分で調べてね
まあPythonですら扱えます、と言うだろうし、非効率ってw?
なんか色々と498が意味するところの理解が追いつかないようだね
講釈するつもりはないから自分で調べてね
506デフォルトの名無しさん
2023/04/24(月) 16:01:06.96ID:aocmIDBf C++の例外は実は途中の関数の各スタックフレームを全て処理してから実行されるため非常に遅い
なぜそうしているかというと途中の各関数で全てデストラクタ処理をしないと正しい継続動作ができないため
結果的に例外といっても各関数で早期リターンするのと同じだけの各処理を行なっている
そして各関数で例外が下からやってくることに備えて対処するコードが余分に必要となっている
そのため例外で返すと速く処理されそうなイメージとは真逆で現実のC++の例外は遅く非効率なものとなっている
なぜそうしているかというと途中の各関数で全てデストラクタ処理をしないと正しい継続動作ができないため
結果的に例外といっても各関数で早期リターンするのと同じだけの各処理を行なっている
そして各関数で例外が下からやってくることに備えて対処するコードが余分に必要となっている
そのため例外で返すと速く処理されそうなイメージとは真逆で現実のC++の例外は遅く非効率なものとなっている
507デフォルトの名無しさん
2023/04/24(月) 16:08:44.38ID:niAvm3Dy まあ初めはシステム言語のつもりはなかっただろうな。
ガベコレのパフォーマンスへの影響が気に入らないけどC++のメモリ管理におけるエラーはきつい
てのがRustの動機だろうし。
ガベコレのパフォーマンスへの影響が気に入らないけどC++のメモリ管理におけるエラーはきつい
てのがRustの動機だろうし。
508デフォルトの名無しさん
2023/04/24(月) 16:09:33.04ID:r05pWbWI そこんとこは、たまに、吐き出されてるバイナリを確認する習慣がほしいとこだね
509デフォルトの名無しさん
2023/04/24(月) 16:17:07.56ID:JV1rcBb8 途中(503,506)から手抜きしてChatGPT的な文が続いているからディフェンスラインは諦めてると思う
510デフォルトの名無しさん
2023/04/24(月) 16:27:16.35ID:Mf9PqUPU511デフォルトの名無しさん
2023/04/24(月) 16:31:03.25ID:+5mPbccJ >>506
設計思想的には、C++の例外機構は、エラーなどの
「例外的に起きる(=滅多に起きない、レアケース)」
の場合のためのものなので、「例外が起きた時」の速度はほとんど考慮
されていない。ただし、誤解無きように捕捉しておくと
「例外が起きなかった時」のコストは配慮されている。
設計思想的には、C++の例外機構は、エラーなどの
「例外的に起きる(=滅多に起きない、レアケース)」
の場合のためのものなので、「例外が起きた時」の速度はほとんど考慮
されていない。ただし、誤解無きように捕捉しておくと
「例外が起きなかった時」のコストは配慮されている。
512デフォルトの名無しさん
2023/04/24(月) 16:32:38.06ID:HICXYXVR >>510
えぇっと、Rustはdrop漏らしちゃうの?
えぇっと、Rustはdrop漏らしちゃうの?
513デフォルトの名無しさん
2023/04/24(月) 16:32:44.46ID:+5mPbccJ 設計思想としては、C++の例外機構は関数からの戻り値を返す目的には設計されてない。
なので、その目的でも使おうと思えば使えるが、速度面の配慮がされてない。
なので、その目的でも使おうと思えば使えるが、速度面の配慮がされてない。
514デフォルトの名無しさん
2023/04/24(月) 16:44:40.41ID:KMWnUB2g あまり詳しくないけどバイナリ出力はLLVMの守備範囲だと思うから
LLVMが対応しないシステムはRustも対象外ってことでいいんだよね
>>510
GC言語でも必要な時はちゃんとfinallyでdisposeすることをお勧めします
LLVMが対応しないシステムはRustも対象外ってことでいいんだよね
>>510
GC言語でも必要な時はちゃんとfinallyでdisposeすることをお勧めします
515デフォルトの名無しさん
2023/04/24(月) 16:45:19.17ID:+5mPbccJ516デフォルトの名無しさん
2023/04/24(月) 16:50:59.79ID:7/BbosrR >>512
Rustにtry throw catchの例外はないのでその話はRustに無関係
代わりにResult返しと?オペレータになって普通にdrop処理もされる
C++のような例外対処コードの付加は必要ない
途中関数で必要に応じて自動エラー型変換も可能だからC++より便利
Rustにtry throw catchの例外はないのでその話はRustに無関係
代わりにResult返しと?オペレータになって普通にdrop処理もされる
C++のような例外対処コードの付加は必要ない
途中関数で必要に応じて自動エラー型変換も可能だからC++より便利
517デフォルトの名無しさん
2023/04/24(月) 16:59:10.31ID:qWiU4JKE518デフォルトの名無しさん
2023/04/24(月) 17:05:38.54ID:D9KAIGag >>515
その正常走行時の意味合いがプログラミング言語によっても変わるし分野によっても変わる
つまりエラー時の意味合いがバラバラで役立たない
例えば指定ファイル複数が一つも存在してなかったら作成して見つかれば内容を返すとしよう
あるファイルが一つ存在しなくても正常走行だが存在しないと例外を出す文化もある
指定ファイル複数全て見つからなくても作成する正常走行だが例外を出す設計する人もいる
エラーとか異常とかの意味するところが色んな人で違ってる
結果としてC++でも例外を使いまくる関数やライブラリがあったり
全てをエラー値として返すライブラリもあったりする
そしてC++の例外は負荷コストがかかる
Googleのように例外使用禁止ルールを設けているところも多い
その正常走行時の意味合いがプログラミング言語によっても変わるし分野によっても変わる
つまりエラー時の意味合いがバラバラで役立たない
例えば指定ファイル複数が一つも存在してなかったら作成して見つかれば内容を返すとしよう
あるファイルが一つ存在しなくても正常走行だが存在しないと例外を出す文化もある
指定ファイル複数全て見つからなくても作成する正常走行だが例外を出す設計する人もいる
エラーとか異常とかの意味するところが色んな人で違ってる
結果としてC++でも例外を使いまくる関数やライブラリがあったり
全てをエラー値として返すライブラリもあったりする
そしてC++の例外は負荷コストがかかる
Googleのように例外使用禁止ルールを設けているところも多い
519デフォルトの名無しさん
2023/04/24(月) 17:16:16.97ID:7/BbosrR520デフォルトの名無しさん
2023/04/24(月) 17:25:55.51ID:Qcn/lsDd 0点、ChatGPT?
そりゃRustはシステムプログラミング言語って標榜するしかこの先生きのこることが
出来ないと考えてるのなら必死ですよね
そりゃRustはシステムプログラミング言語って標榜するしかこの先生きのこることが
出来ないと考えてるのなら必死ですよね
521デフォルトの名無しさん
2023/04/24(月) 17:28:30.42ID:r05pWbWI C++は例外対応をオプションでOFFにできる おなじように、safe/unsafeもできるようにはやくなってくれ
522デフォルトの名無しさん
2023/04/24(月) 18:06:06.65ID:LQT8UQ2a >>506
ローカル変数のデストラクタを呼び出すこと自体はC++で例外投げてもRustでErr返しても同じなので
そこは別にRustのアドバンテージではない
その調子でC++の勘違い名言集の量産お願いしますよ
ローカル変数のデストラクタを呼び出すこと自体はC++で例外投げてもRustでErr返しても同じなので
そこは別にRustのアドバンテージではない
その調子でC++の勘違い名言集の量産お願いしますよ
523デフォルトの名無しさん
2023/04/24(月) 18:08:15.36ID:p+d7XoeA524デフォルトの名無しさん
2023/04/24(月) 18:13:22.35ID:p+d7XoeA >>522
C++の例外がコスト高いと言われているのは、デストラクターを呼び出すこと自体ではなくて、
例外が関数を通過するときに適切にデストラクターを呼び出せるように、そのテーブルやコードを用意することだと記憶してるが。
C++の例外がコスト高いと言われているのは、デストラクターを呼び出すこと自体ではなくて、
例外が関数を通過するときに適切にデストラクターを呼び出せるように、そのテーブルやコードを用意することだと記憶してるが。
525デフォルトの名無しさん
2023/04/24(月) 18:14:58.99ID:3hT7+QpV526デフォルトの名無しさん
2023/04/24(月) 18:15:34.58ID:LQT8UQ2a >>502以降の流れの非同期例外ってたぶんasync/awaitじゃなくて割り込みやシグナルのことだと思うんですけども……
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が強そう
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「高市さん負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 [樽悶★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- 【為替】対ドルで157円台、対ユーロ181円台に下落 財政悪化を警戒 [蚤の市★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- フィフィ、中国の“日本産水産物輸入停止”措置に私見「中国依存しないとやっていけない企業は考えを改めて」 [Anonymous★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 ★2 [おっさん友の会★]
- 【悲報】高市早苗「“なり得る”って言っただけでなんでそんなに叩くの?私女なんですけど!」 [616817505]
- 【悲報】倉田真由美「なんで高市は子供がいる家庭に2万円給付するの?子供がいる家庭ばかり優遇するのおかしくね?」 [802034645]
- 【高市外交】日本の局長が有能だったとの事。わざと困り顔で頭を下げる写真を撮らせ、中国内で好印象も、世界は中国の態度を非難という構図 [219241683]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 関係者「高市首相は円安のデメリットをいまひとつ、わかっていないようだ」 [435756605]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
