探検
結局C++とRustってどっちが良いの?
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
2023/02/25(土) 09:49:46.74ID:VRyB88xR C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
864デフォルトの名無しさん
2023/03/31(金) 00:15:58.98ID:EUO40WZ7 >>862
いや条件分岐ってディスパッチやろ
いや条件分岐ってディスパッチやろ
865デフォルトの名無しさん
2023/03/31(金) 00:18:07.60ID:4rLmkYuJ866デフォルトの名無しさん
2023/03/31(金) 00:20:19.18ID:RaXhcLNj C++のmatchはもういいの?
867デフォルトの名無しさん
2023/03/31(金) 00:21:06.03ID:EUO40WZ7 条件により振る舞いが分岐するので同じ
868デフォルトの名無しさん
2023/03/31(金) 00:22:01.37ID:E+GQTsPO >>863
型情報を整数値で表すのは当たり前だけど
それは型情報ではない普通のデータの整数値の分岐とは話が全く違う
型情報によって呼び出すメソッドが変わるからそれを決定することをディスパッチと呼ぶ
その型情報が静的に決まるか動的にきまるかの違いのみ
typeidを使っているならば型情報が動的に決まっているのだから動的ディスパッチ
型情報を整数値で表すのは当たり前だけど
それは型情報ではない普通のデータの整数値の分岐とは話が全く違う
型情報によって呼び出すメソッドが変わるからそれを決定することをディスパッチと呼ぶ
その型情報が静的に決まるか動的にきまるかの違いのみ
typeidを使っているならば型情報が動的に決まっているのだから動的ディスパッチ
869デフォルトの名無しさん
2023/03/31(金) 00:23:24.62ID:XMbQ83Rx >>834
そもそもそれをディスパッチと普通呼ぶ?
やってることはvtable使った動的ディスパッチも似たようなものだから
動的ディスパッチの一種とすることにそこまで違和感はないけど
広く浸透してる定義ではないよね
そもそもそれをディスパッチと普通呼ぶ?
やってることはvtable使った動的ディスパッチも似たようなものだから
動的ディスパッチの一種とすることにそこまで違和感はないけど
広く浸透してる定義ではないよね
870デフォルトの名無しさん
2023/03/31(金) 00:24:13.24ID:EUO40WZ7 名称はともかくmatchの分岐はコンパイル時に決まらず
実行時に比較のオーバヘッドがある認識は共通しているので
何も対立はないはず
C++のmatchの話にもどしましょ
実行時に比較のオーバヘッドがある認識は共通しているので
何も対立はないはず
C++のmatchの話にもどしましょ
871デフォルトの名無しさん
2023/03/31(金) 00:26:02.54ID:EUO40WZ7872デフォルトの名無しさん
2023/03/31(金) 00:33:40.04ID:RaXhcLNj まず>>846のstatic dispatchのページからとって来た文章をdynamic dispatchの「定義」として参照するのが間違い
こりゃすでにdynamic dispatchが定義された前提の上で、static dispatchと異なる点を書いているだけだよ
自分の思い込みを肯定するために都合良く文章を解釈してしまうのは人間やりがちだけどね
こりゃすでにdynamic dispatchが定義された前提の上で、static dispatchと異なる点を書いているだけだよ
自分の思い込みを肯定するために都合良く文章を解釈してしまうのは人間やりがちだけどね
873デフォルトの名無しさん
2023/03/31(金) 00:34:12.53ID:4rLmkYuJ874デフォルトの名無しさん
2023/03/31(金) 00:34:43.78ID:E+GQTsPO 話は簡単
まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
つまり「型情報が決まると呼び出すメソッドが決まる」
この決定のことをディスパッチと呼ぶ
静的に型情報が決まる場合は静的ディスパッチが可能
動的に型情報が決まる場合は動的ディスパッチとなる
型情報と関係ない話はどちらでもない
まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
つまり「型情報が決まると呼び出すメソッドが決まる」
この決定のことをディスパッチと呼ぶ
静的に型情報が決まる場合は静的ディスパッチが可能
動的に型情報が決まる場合は動的ディスパッチとなる
型情報と関係ない話はどちらでもない
875デフォルトの名無しさん
2023/03/31(金) 00:40:10.18ID:RaXhcLNj >>874
> まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
> つまり「型情報が決まると呼び出すメソッドが決まる」
> この決定のことをディスパッチと呼ぶ
ここだけ読むとオーバーロード解決に聞こえるねw
https://ja.cppreference.com/w/cpp/language/overload_resolution
> まず前提「オーバーロードにより型が決まらないと呼び出す実メソッドが決まらない」
> つまり「型情報が決まると呼び出すメソッドが決まる」
> この決定のことをディスパッチと呼ぶ
ここだけ読むとオーバーロード解決に聞こえるねw
https://ja.cppreference.com/w/cpp/language/overload_resolution
876デフォルトの名無しさん
2023/03/31(金) 01:54:38.14ID:EgdFd66u Visitorパターン=多重ディスパッチ説があったからそれが元凶だろう
複数のメンバー関数から一つ選ぶのもディスパッチ
だから多重という
複数のメンバー関数から一つ選ぶのもディスパッチ
だから多重という
877デフォルトの名無しさん
2023/03/31(金) 03:36:49.58ID:jnb+4hS9 動的ディスパッチや静的ディスパッチは
何をディスパッチするのか考えなよ
何をディスパッチするのか考えなよ
878デフォルトの名無しさん
2023/03/31(金) 07:31:14.10ID:8I8WcMJF Rustは普通に書くだけでこのスレで言うところの静的ディスパッチとなりコンパイル時点で単相化されて速い
実行時にしか型が判明しない場合に対してはdyn指定による動的ディスパッチが可能でvtableが使われる
vtableを避けたいならばenumに包むことで直和型として収容して扱うこともできる
実行時にしか型が判明しない場合に対してはdyn指定による動的ディスパッチが可能でvtableが使われる
vtableを避けたいならばenumに包むことで直和型として収容して扱うこともできる
879デフォルトの名無しさん
2023/03/31(金) 09:01:13.01ID:RaXhcLNj >>878
C++でも同じだよ
C++でも同じだよ
880デフォルトの名無しさん
2023/03/31(金) 10:05:33.29ID:TtdiO46p vtableの持ち方がRustとC++では違うんだよね
881デフォルトの名無しさん
2023/03/31(金) 10:09:37.79ID:BBtS0ztF882デフォルトの名無しさん
2023/03/31(金) 11:47:51.48ID:3PkVSivi C++では、クラスが仮想関数を持つ場合、そのクラスのインスタンスに対して仮想関数テーブルが作成される。
仮想関数テーブルには、仮想関数へのポインタが含まれインスタンスに対して仮想関数が呼び出されるたびに
vtableを参照して適切な関数が呼び出される。
Rustでは動的ディスパッチを実現するためにトレイトオブジェクトが使用される。
トレイトオブジェクトには、traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
インスタンスに対してメソッドが呼び出されるたびに、トレイトオブジェクトが参照され
適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
結果は同じ。
仮想関数テーブルには、仮想関数へのポインタが含まれインスタンスに対して仮想関数が呼び出されるたびに
vtableを参照して適切な関数が呼び出される。
Rustでは動的ディスパッチを実現するためにトレイトオブジェクトが使用される。
トレイトオブジェクトには、traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
インスタンスに対してメソッドが呼び出されるたびに、トレイトオブジェクトが参照され
適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
結果は同じ。
883デフォルトの名無しさん
2023/03/31(金) 12:51:42.96ID:RaXhcLNj >>882
詳細の説明がいろいろおかしいと思うけどどこソースなの?
詳細の説明がいろいろおかしいと思うけどどこソースなの?
884デフォルトの名無しさん
2023/03/31(金) 18:30:12.19ID:fT81IvHH >>883
『複オジ妄想虚言録』
『複オジ妄想虚言録』
885デフォルトの名無しさん
2023/03/31(金) 18:44:18.60ID:KJ4yMLmS886デフォルトの名無しさん
2023/03/31(金) 18:50:12.77ID:Q5ExbgOu >>882
うーむひどいな
とりあえずRustについて、この部分の間違いはあまりにひどい
> traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
> 適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
Rustは常にメソッドが静的に一意に確定するため、動的ディスパッチでも適切なポインタが見つかるまでリストを検索する必要がない
Rustはメソッド名が衝突する場合、まず自分の定義優先で確定、なくてトレイト間に衝突がなければ確定、衝突があればエラーだが、トレイト名を指定することでどのトレイトのメソッドでも常に利用可能
つまりRustではメソッド呼び出しが自分のメソッドかどのトレイトのメソッドかが静的に一意に確定する
静的ポリモーフィズムとして使われるときは、必要とする最小限のトレイトを列挙(=トレイト境界)するため、メソッドの衝突の可能性は通常時よりも減ったり無くなったりする
いずれにせよ上述したようにメソッドは静的に一意に定まるため、静的ディスパッチでは単相化(モノモーフィゼーション)されてコンパイルされる
動的ポリモーフィズムとして使われるときは、現在の仕様では指定できるトレイトは(auto traitを除き)一つのみに限定されている
ただし必要とするトレイトを列挙(=トレイト境界)したダミーなトレイトを任意に作ることも可能なため、事実上は複数のトレイトを指定できるのと同じ
指定トレイトが一つに限定されているということは、(そのトレイト境界を含めた)トレイト群すべてのメソッドを静的に一斉に把握できることを意味する
つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく、呼び出すメソッドは静的に確定してインデックス値となっているため、動的ディスパッチでも高速にメソッドを呼び出せる
うーむひどいな
とりあえずRustについて、この部分の間違いはあまりにひどい
> traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
> 適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。
Rustは常にメソッドが静的に一意に確定するため、動的ディスパッチでも適切なポインタが見つかるまでリストを検索する必要がない
Rustはメソッド名が衝突する場合、まず自分の定義優先で確定、なくてトレイト間に衝突がなければ確定、衝突があればエラーだが、トレイト名を指定することでどのトレイトのメソッドでも常に利用可能
つまりRustではメソッド呼び出しが自分のメソッドかどのトレイトのメソッドかが静的に一意に確定する
静的ポリモーフィズムとして使われるときは、必要とする最小限のトレイトを列挙(=トレイト境界)するため、メソッドの衝突の可能性は通常時よりも減ったり無くなったりする
いずれにせよ上述したようにメソッドは静的に一意に定まるため、静的ディスパッチでは単相化(モノモーフィゼーション)されてコンパイルされる
動的ポリモーフィズムとして使われるときは、現在の仕様では指定できるトレイトは(auto traitを除き)一つのみに限定されている
ただし必要とするトレイトを列挙(=トレイト境界)したダミーなトレイトを任意に作ることも可能なため、事実上は複数のトレイトを指定できるのと同じ
指定トレイトが一つに限定されているということは、(そのトレイト境界を含めた)トレイト群すべてのメソッドを静的に一斉に把握できることを意味する
つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく、呼び出すメソッドは静的に確定してインデックス値となっているため、動的ディスパッチでも高速にメソッドを呼び出せる
887デフォルトの名無しさん
2023/03/31(金) 18:59:29.64ID:Q5ExbgOu 間違ったことを書いてる人は完全に悪いけど、内容があれば議論のネタになるからまだマシ
それに対して間違ってる!とか、虚言!とかだけ言う連中は全く役に立たないから無視してよい
なぜなら、正しいことが書かれている場合でも、間違ってる!とか適当なこと言ったりするだけの連中も多いため
それに対して間違ってる!とか、虚言!とかだけ言う連中は全く役に立たないから無視してよい
なぜなら、正しいことが書かれている場合でも、間違ってる!とか適当なこと言ったりするだけの連中も多いため
888デフォルトの名無しさん
2023/03/31(金) 19:02:37.99ID:RaXhcLNj889デフォルトの名無しさん
2023/03/31(金) 19:13:25.65ID:Q5ExbgOu890デフォルトの名無しさん
2023/03/31(金) 19:25:39.32ID:Wg79uBjg OpenCV-rs ってもうメンテされてないんか?
gdgd なんだが
gdgd なんだが
891デフォルトの名無しさん
2023/03/31(金) 19:29:08.86ID:RaXhcLNj892デフォルトの名無しさん
2023/03/31(金) 19:30:39.96ID:RaXhcLNj 756じゃなくてこっちだった
https://mevius.5ch.net/test/read.cgi/tech/1677286186/765
https://mevius.5ch.net/test/read.cgi/tech/1677286186/765
893デフォルトの名無しさん
2023/03/31(金) 19:38:42.25ID:Wg79uBjg >動的ディスパッチ
もしかして
遅延バインディング
もしかして
遅延バインディング
894デフォルトの名無しさん
2023/03/31(金) 19:40:08.33ID:7j0Yg6pd おじオジ言ってる人は頭がおかしいと他のスレで習ったけどここでもそうなの?
895デフォルトの名無しさん
2023/03/31(金) 19:59:22.01ID:RaXhcLNj896デフォルトの名無しさん
2023/03/31(金) 20:11:31.44ID:EgdFd66u897デフォルトの名無しさん
2023/03/31(金) 20:19:56.47ID:f9v7p1HY 祖先のテーブルをたどっていく実装や言語あるよ
特にJavaScriptはメソッドを後から生やせるから大変だった
特にJavaScriptはメソッドを後から生やせるから大変だった
898デフォルトの名無しさん
2023/03/31(金) 20:24:26.37ID:JGH7phMu >>896
とりあえず、プライドは高いということは分かった
とりあえず、プライドは高いということは分かった
899デフォルトの名無しさん
2023/03/31(金) 21:01:50.63ID:J9Ac7zVb900デフォルトの名無しさん
2023/03/31(金) 21:50:12.55ID:RJ6Se/g4 1. 知ったかぶりして嘘をさも本当かのように書き連ねる
2. 間違いを指摘されるとググって必死に正解を探す
3. そしてそんなことは最初から知ってましたというトーンで長文まとめスレを他人のフリして書く
これが複オジメソッド
2. 間違いを指摘されるとググって必死に正解を探す
3. そしてそんなことは最初から知ってましたというトーンで長文まとめスレを他人のフリして書く
これが複オジメソッド
901デフォルトの名無しさん
2023/03/31(金) 22:09:18.69ID:RaXhcLNj902デフォルトの名無しさん
2023/03/31(金) 22:18:57.16ID:Q5ExbgOu903デフォルトの名無しさん
2023/03/31(金) 22:43:55.74ID:e2Ah0StU904デフォルトの名無しさん
2023/03/31(金) 22:50:43.27ID:RaXhcLNj >>902
その「間違ってる本人」は>>882のことを指していて、間違いがあるのは>>886のことではないと思うが
それはそれとして>>886の間違いを指摘しておくと
あなたC++で「どのvtableを見るべきか」を実行時にしか判断できないケースがあると思ってない? 嘘だよそれ
じゃないと「メソッドの衝突の可能性」なんて話が出てくる理由が無いと思うんだよね
そんなもんは静的に解決されて当然なのだから
ていうかね、参考にしたリンク貼ってくださいよって何回も言ってるでしょう
そのほうがあなたが(もしかすると私が)何を勘違いしているのかという答えにたどり着きやすいですって
いちいちあなたも長文で解説しなくて済むんですよ
その「間違ってる本人」は>>882のことを指していて、間違いがあるのは>>886のことではないと思うが
それはそれとして>>886の間違いを指摘しておくと
あなたC++で「どのvtableを見るべきか」を実行時にしか判断できないケースがあると思ってない? 嘘だよそれ
じゃないと「メソッドの衝突の可能性」なんて話が出てくる理由が無いと思うんだよね
そんなもんは静的に解決されて当然なのだから
ていうかね、参考にしたリンク貼ってくださいよって何回も言ってるでしょう
そのほうがあなたが(もしかすると私が)何を勘違いしているのかという答えにたどり着きやすいですって
いちいちあなたも長文で解説しなくて済むんですよ
905デフォルトの名無しさん
2023/03/31(金) 23:03:06.56ID:Q5ExbgOu906デフォルトの名無しさん
2023/03/31(金) 23:13:20.94ID:oRUGNWak907デフォルトの名無しさん
2023/03/31(金) 23:15:00.18ID:RaXhcLNj >>905
なるほどね?
例えば「検索する必要がない」「メソッドの衝突の可能性は通常時よりも減ったり無くなったりする」は対比的にそれらが「ある」存在に暗に言及しているのだと思ったよ
行間を読んで根本的に何を勘違いしているのか探ろうと思ったが、これはあくまでRustに関する言及でしかないと
「高速」も何と比較してなのか不明で虚しい響きがあるが、高速だというならそうなんだろう
じゃあ私から言えるのはこれだけです
> Rustは常にメソッドが静的に一意に確定する
じゃあRustに動的ディスパッチなんて実装する必要無いじゃん
dyn存在意義無いじゃん
「『トレイトとメソッド名のペア』が一意に確定する」ならそう書かないと、この文脈でこの表現は語弊しか無いよ
なるほどね?
例えば「検索する必要がない」「メソッドの衝突の可能性は通常時よりも減ったり無くなったりする」は対比的にそれらが「ある」存在に暗に言及しているのだと思ったよ
行間を読んで根本的に何を勘違いしているのか探ろうと思ったが、これはあくまでRustに関する言及でしかないと
「高速」も何と比較してなのか不明で虚しい響きがあるが、高速だというならそうなんだろう
じゃあ私から言えるのはこれだけです
> Rustは常にメソッドが静的に一意に確定する
じゃあRustに動的ディスパッチなんて実装する必要無いじゃん
dyn存在意義無いじゃん
「『トレイトとメソッド名のペア』が一意に確定する」ならそう書かないと、この文脈でこの表現は語弊しか無いよ
908デフォルトの名無しさん
2023/03/31(金) 23:19:08.47ID:EgdFd66u 自分が長文を書きたいのではなく、相手に自分の真似をさせたいんじゃないか
知らんけど
真似してくれれば人間皆どっちもどっちだと実証されるかも知れないから
知らんけど
真似してくれれば人間皆どっちもどっちだと実証されるかも知れないから
909デフォルトの名無しさん
2023/03/31(金) 23:22:31.74ID:tr7cKY8h ぽまいら一人一人が要点を絞ってくれ
発散させあってたらきりがないんよ
余計なことは省くこと
余計じゃないものが複数あってもより大事なほうを一つ選んで議論を続行すること
発散させあってたらきりがないんよ
余計なことは省くこと
余計じゃないものが複数あってもより大事なほうを一つ選んで議論を続行すること
910デフォルトの名無しさん
2023/03/31(金) 23:22:49.85ID:hy3TCCAc911デフォルトの名無しさん
2023/03/31(金) 23:28:00.63ID:JG8RdAc0 動的ディスパッチするために必要な間接参照の数はRustもC++も同じで高速とか低速とかないから
Rustは動的ディスパッチを使う場合は必ずポインタ経由になるので構造体のデータを読むのに間接参照が1回必ず入る
これが持ち方の違いによって出る差の一つ
Rustは動的ディスパッチを使う場合は必ずポインタ経由になるので構造体のデータを読むのに間接参照が1回必ず入る
これが持ち方の違いによって出る差の一つ
912デフォルトの名無しさん
2023/03/31(金) 23:50:08.60ID:FlP4pMOX あ、多重継承のケースがあったか
でもまあ気にするようなオーバーヘッドじゃないよね
でもまあ気にするようなオーバーヘッドじゃないよね
913デフォルトの名無しさん
2023/03/31(金) 23:51:44.88ID:Q5ExbgOu >>907
後半の指摘については、短い中で詳細まで説明できていないから誤解を与えてしまったもしれないので、そこはすまん
しかしその指摘だとまだ別の誤解されてそうだからその部分についてだけ一応書いておくと
ある型Fooのメソッドmethodの各呼び出しがそれぞれ異なっていてもよくて
Foo::method() なのか
<Foo as Trait1>::method() なのか
<Foo as Trait2>::method() なのかが決まり
Foo::method()がなくてそれ以外が複数で曖昧な時はエラーになるというだけの話
いろんな言語があるからね
後半の指摘については、短い中で詳細まで説明できていないから誤解を与えてしまったもしれないので、そこはすまん
しかしその指摘だとまだ別の誤解されてそうだからその部分についてだけ一応書いておくと
ある型Fooのメソッドmethodの各呼び出しがそれぞれ異なっていてもよくて
Foo::method() なのか
<Foo as Trait1>::method() なのか
<Foo as Trait2>::method() なのかが決まり
Foo::method()がなくてそれ以外が複数で曖昧な時はエラーになるというだけの話
いろんな言語があるからね
914デフォルトの名無しさん
2023/03/31(金) 23:57:35.53ID:RaXhcLNj >>913
具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
そしてこのときトレイトは確定しているのでメソッド名は衝突しません
だからメソッド名の衝突の話が出てくる意味が分からないと言っているんです
具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
そしてこのときトレイトは確定しているのでメソッド名は衝突しません
だからメソッド名の衝突の話が出てくる意味が分からないと言っているんです
915デフォルトの名無しさん
2023/03/31(金) 23:57:58.72ID:cX1DOwsp916デフォルトの名無しさん
2023/03/31(金) 23:59:30.92ID:Q5ExbgOu917デフォルトの名無しさん
2023/04/01(土) 00:04:38.33ID:AdU+jSWJ918デフォルトの名無しさん
2023/04/01(土) 00:04:51.67ID:XaCtro1R919デフォルトの名無しさん
2023/04/01(土) 00:09:36.60ID:+ti2a57c そのムーブはわかってないけどとりあえずケチつけてんだなとしか思わないよ
指摘できないけど誰か論破してくれねーかなっていう情けない感じ
指摘できないけど誰か論破してくれねーかなっていう情けない感じ
920デフォルトの名無しさん
2023/04/01(土) 00:09:53.12ID:YJwv5+OD921デフォルトの名無しさん
2023/04/01(土) 00:12:20.97ID:ktHgE8AY922デフォルトの名無しさん
2023/04/01(土) 00:13:02.49ID:+UQ+9Bf4 >>915
全然焦点じゃないから気にすんな
全然焦点じゃないから気にすんな
924デフォルトの名無しさん
2023/04/01(土) 00:21:52.63ID:AdU+jSWJ >>921
まだ理解できていないのか?
動的ディスパッチの時こそメソッド名の衝突に対しての処置が重要
そのためどのトレイトのメソッドを呼び出すかを静的に確定するとともに
各トレイトの同名メソッドを区別してvtableのインデックス化をしている
まだ理解できていないのか?
動的ディスパッチの時こそメソッド名の衝突に対しての処置が重要
そのためどのトレイトのメソッドを呼び出すかを静的に確定するとともに
各トレイトの同名メソッドを区別してvtableのインデックス化をしている
925デフォルトの名無しさん
2023/04/01(土) 00:32:15.20ID:DyolynIp926デフォルトの名無しさん
2023/04/01(土) 00:34:01.19ID:ktHgE8AY >>924
「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」
ここを詳しく説明してくれますか?
必要なら次の例を使ってください(こういう状況のことでいいんですよね?)
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a72f5f361d0e82594bace55483e66c7c
「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」
ここを詳しく説明してくれますか?
必要なら次の例を使ってください(こういう状況のことでいいんですよね?)
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a72f5f361d0e82594bace55483e66c7c
927デフォルトの名無しさん
2023/04/01(土) 00:35:46.81ID:YJwv5+OD >>925
インデックス区別しないと動的ディスパッチできないですよ
インデックス区別しないと動的ディスパッチできないですよ
928デフォルトの名無しさん
2023/04/01(土) 00:50:45.22ID:ktHgE8AY SubとSuper逆だわ
気になるなら直してていいよ
気になるなら直してていいよ
929デフォルトの名無しさん
2023/04/01(土) 00:56:33.36ID:tiKbQym2930デフォルトの名無しさん
2023/04/01(土) 01:55:13.58ID:AdU+jSWJ >>926
トレイトオブジェクトを扱うためにBoxは不要
ヒープを使うのは必要性があるときのみ
求められているのは俺が書いた「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」の部分だろ
それを直接わかるコードを書いた
ただしvtableはpubではないので現状の仕様を強引にアクセス
インデックス値の順序も変わる可能性ありなので注意
macro_rules! vtable_base { ($dyn:expr) => { *(&$dyn as *const _ as *const usize).offset(1) as *const usize } }
macro_rules! vtable { ($dyn:expr, $index:expr) => { unsafe { *(vtable_base!($dyn).offset($index)) } } }
trait TraitA {
fn method(&self);
}
trait TraitB {
fn method(&self);
}
trait TraitAB: TraitA + TraitB {}
struct Foo;
impl TraitA for Foo { fn method(&self) {} }
impl TraitB for Foo { fn method(&self) {} }
impl TraitAB for Foo {}
fn main() {
let foo = Foo;
let dyn_foo: &dyn TraitAB = &foo;
assert_eq!(vtable![dyn_foo, 3], <Foo as TraitA>::method as usize);
assert_eq!(vtable![dyn_foo, 4], <Foo as TraitB>::method as usize);
}
というわけで動的ディスパッチでもメソッド名衝突の話は必要であり>>886の説明で合っている
トレイトオブジェクトを扱うためにBoxは不要
ヒープを使うのは必要性があるときのみ
求められているのは俺が書いた「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」の部分だろ
それを直接わかるコードを書いた
ただしvtableはpubではないので現状の仕様を強引にアクセス
インデックス値の順序も変わる可能性ありなので注意
macro_rules! vtable_base { ($dyn:expr) => { *(&$dyn as *const _ as *const usize).offset(1) as *const usize } }
macro_rules! vtable { ($dyn:expr, $index:expr) => { unsafe { *(vtable_base!($dyn).offset($index)) } } }
trait TraitA {
fn method(&self);
}
trait TraitB {
fn method(&self);
}
trait TraitAB: TraitA + TraitB {}
struct Foo;
impl TraitA for Foo { fn method(&self) {} }
impl TraitB for Foo { fn method(&self) {} }
impl TraitAB for Foo {}
fn main() {
let foo = Foo;
let dyn_foo: &dyn TraitAB = &foo;
assert_eq!(vtable![dyn_foo, 3], <Foo as TraitA>::method as usize);
assert_eq!(vtable![dyn_foo, 4], <Foo as TraitB>::method as usize);
}
というわけで動的ディスパッチでもメソッド名衝突の話は必要であり>>886の説明で合っている
931デフォルトの名無しさん
2023/04/01(土) 03:08:57.82ID:TpFQVX+V932デフォルトの名無しさん
2023/04/01(土) 03:10:50.58ID:AdU+jSWJ933デフォルトの名無しさん
2023/04/01(土) 03:16:00.87ID:TpFQVX+V934デフォルトの名無しさん
2023/04/01(土) 03:30:04.06ID:AdU+jSWJ935デフォルトの名無しさん
2023/04/01(土) 05:02:11.23ID:J25MoQ6T C++からメタ言語機能のような黒魔術を無くして使いやすくしたのがRustという認識でよろしいか?
936デフォルトの名無しさん
2023/04/01(土) 05:11:37.13ID:J25MoQ6T 今月のInterfaceはRust特集だぞ
937デフォルトの名無しさん
2023/04/01(土) 05:12:17.82ID:J25MoQ6T C++に挫折した者ども、いまこそRustに集え
938デフォルトの名無しさん
2023/04/01(土) 06:30:37.76ID:ol7Kdurc マ板でやれ無能
>>3を理解しろ
>>3を理解しろ
939デフォルトの名無しさん
2023/04/01(土) 06:56:17.26ID:073QzAPe ディスパッチがどうとか言ってるあいだに1000きそうだぞこれ
なんだかんだで実際は両方使うけど、やっぱ俺はこっち推すぜ! みたいなスレになりつつ
テンプレ用意すんの?
なんだかんだで実際は両方使うけど、やっぱ俺はこっち推すぜ! みたいなスレになりつつ
テンプレ用意すんの?
940デフォルトの名無しさん
2023/04/01(土) 10:28:30.10ID:h8xyCGJ+941デフォルトの名無しさん
2023/04/01(土) 10:56:30.89ID:3pQ6SLTI 要するに「へぇ、継承ってのがあるのか、どうやって実現するんやろ?あ、オレならこうするな、でもそれだとこうなってコストメチャメチャかかるじゃん、使えねぇな」と思ってるくちじゃないの?
942デフォルトの名無しさん
2023/04/01(土) 11:11:44.89ID:IIYgmYPv その件は>>930が正しい
assert通るのを確認した
assert通るのを確認した
943デフォルトの名無しさん
2023/04/01(土) 12:25:26.51ID:ktHgE8AY >>930
言いたいことは理解した
でもね、そもそも「衝突」は定義だけで発生するものなんですよ
そのコードのmainの中でdyn_foo.method()と書くと発生するエラーは、「名前解決の失敗」と呼ばれます
そしてこの「衝突」の有り無しは、「vtableのインデックス化」に特に影響を与えません
現に片方だけメソッド名を変更しても、同じレイアウトになりますよね
内部的には別トレイトのメソッドなのだから、"method"部分が「衝突」するしないに関係なく区別されます
「衝突」に、vtableに関して特筆すべき重要性は無いと思います
言いたいことは理解した
でもね、そもそも「衝突」は定義だけで発生するものなんですよ
そのコードのmainの中でdyn_foo.method()と書くと発生するエラーは、「名前解決の失敗」と呼ばれます
そしてこの「衝突」の有り無しは、「vtableのインデックス化」に特に影響を与えません
現に片方だけメソッド名を変更しても、同じレイアウトになりますよね
内部的には別トレイトのメソッドなのだから、"method"部分が「衝突」するしないに関係なく区別されます
「衝突」に、vtableに関して特筆すべき重要性は無いと思います
944デフォルトの名無しさん
2023/04/01(土) 12:47:01.18ID:km+jzk5n 静的型付けをしてればどのメソッド実装を呼び出すか静的に決まるのは当たり前のこと
それを何か特別なことのように変な長文書くからバカにされる
それを何か特別なことのように変な長文書くからバカにされる
945デフォルトの名無しさん
2023/04/01(土) 13:18:48.32ID:hxeslJ4Q C++er あるあるシリーズ
#![allow(unused)]
... = hoge().unwrap;
... = hoge()?;
let p: *const [u8] = &fuga;
unsafe {}
#![allow(unused)]
... = hoge().unwrap;
... = hoge()?;
let p: *const [u8] = &fuga;
unsafe {}
946デフォルトの名無しさん
2023/04/01(土) 13:25:38.29ID:hxeslJ4Q >>900
chatGPT そのもののことだな
chatGPT そのもののことだな
947デフォルトの名無しさん
2023/04/01(土) 13:33:41.52ID:hxeslJ4Q >>936
みたけどイマイチ
みたけどイマイチ
948デフォルトの名無しさん
2023/04/01(土) 13:35:01.01ID:hxeslJ4Q949デフォルトの名無しさん
2023/04/01(土) 13:38:19.66ID:goAbMbb3 面白いのはC++ちょっとかじったくらいのド素人ほど
なぜかRustに引き寄せられてる気がする
ニワカ人間を引きつける同じニオイがするんだろうなRustには
なぜかRustに引き寄せられてる気がする
ニワカ人間を引きつける同じニオイがするんだろうなRustには
950デフォルトの名無しさん
2023/04/01(土) 13:46:59.44ID:WHqiXdwW C++は底なし沼な感じが良い
未だにModern C++ Designを初めて読んだときの衝撃を上回る
本には出会ったことがない
未だにModern C++ Designを初めて読んだときの衝撃を上回る
本には出会ったことがない
951デフォルトの名無しさん
2023/04/01(土) 14:05:07.99ID:goAbMbb3 職業マとアマチュアで感想違うよね
職業マ「C++? 糞の糞糞」
アマチュア「C++? vtableのコスト(キャッキャ)
鼻から悪魔(ウフフフ)膝を撃ち抜く(キャッキャ)CRTP(ウフフ)
職業マ「C++? 糞の糞糞」
アマチュア「C++? vtableのコスト(キャッキャ)
鼻から悪魔(ウフフフ)膝を撃ち抜く(キャッキャ)CRTP(ウフフ)
952デフォルトの名無しさん
2023/04/01(土) 14:25:21.95ID:hxeslJ4Q Javaは糞
C#はチョット良い感じ
Juliaは死んだ
Rustがんがれ
Nimもがんがれ
C++は使い続けるけどね
C#はチョット良い感じ
Juliaは死んだ
Rustがんがれ
Nimもがんがれ
C++は使い続けるけどね
953デフォルトの名無しさん
2023/04/01(土) 15:11:33.70ID:rIj/v2ga954デフォルトの名無しさん
2023/04/01(土) 16:41:11.09ID:HWGbnwVz >>944
同名メソッドが衝突した時にどうなるかは言語によってかなり異なるから一番重要じゃないかな
衝突が許されない言語と許される場合も条件がある場合もあるよ
衝突があってもエラー出ない言語もあれば特定な時だけエラーな言語もあるね
回避方法も別名定義方式から同名自己定義や直接指定と色々だ
同名メソッドが衝突した時にどうなるかは言語によってかなり異なるから一番重要じゃないかな
衝突が許されない言語と許される場合も条件がある場合もあるよ
衝突があってもエラー出ない言語もあれば特定な時だけエラーな言語もあるね
回避方法も別名定義方式から同名自己定義や直接指定と色々だ
955デフォルトの名無しさん
2023/04/01(土) 17:25:01.59ID:/8VZFYJJ Rustが「認め」られたことで、C++のスマポも、べき・べからずが確定したと考えておk?
956デフォルトの名無しさん
2023/04/01(土) 17:29:58.10ID:WHqiXdwW >>955
どういう意味?
どういう意味?
957デフォルトの名無しさん
2023/04/01(土) 17:52:08.96ID:/8VZFYJJ 大手が認めたんだから、Rustと同等に書ければ、それはsafeなんだよな?
これまで、C++のスマポは、CppCoreGuidelinesなんてものはあっても、強制されなかった
これまで、C++のスマポは、CppCoreGuidelinesなんてものはあっても、強制されなかった
958デフォルトの名無しさん
2023/04/01(土) 18:00:21.17ID:WHqiXdwW Rustに関係なくC++ではスマートポインタを使用すれば安全に書けるし
スマートポインタの使用するしないにRustは全く関係ない?
ここ見てる人は俺も含めてRustに注目してはいるが
C++ユーザのほとんどはRustなど眼中にないだろう
スマートポインタの使用するしないにRustは全く関係ない?
ここ見てる人は俺も含めてRustに注目してはいるが
C++ユーザのほとんどはRustなど眼中にないだろう
959デフォルトの名無しさん
2023/04/01(土) 18:01:23.45ID:WHqiXdwW 二行目最後?を消し忘れた
960デフォルトの名無しさん
2023/04/01(土) 18:06:42.88ID:/8VZFYJJ 強制されるってのがミソだろ Rust派は、Rustなら、必ず・全部安全って言ってるんだからさ
961デフォルトの名無しさん
2023/04/01(土) 18:09:42.77ID:vBVsKFoD >>933
某オジお得意の誤訳だったんじゃねーの?
某オジお得意の誤訳だったんじゃねーの?
962デフォルトの名無しさん
2023/04/01(土) 19:15:27.20ID:ugeMTEEj >>914
> 具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
逆
動的ディスパッチが実行される時点では必ず具体型Fooが確定している
> dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
> そしてこのときトレイトは確定しているのでメソッド名は衝突しません
衝突する
直接のトレイトは確定しても付随するトレイト境界があれば各トレイトでメソッド名は衝突しうる
> 具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
逆
動的ディスパッチが実行される時点では必ず具体型Fooが確定している
> dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
> そしてこのときトレイトは確定しているのでメソッド名は衝突しません
衝突する
直接のトレイトは確定しても付随するトレイト境界があれば各トレイトでメソッド名は衝突しうる
963デフォルトの名無しさん
2023/04/01(土) 19:16:31.21ID:ma7yA/CEレス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- (´・ω・`)クリスマスが今年もやってくる~
- 千晴さん千晴さん
- 晃←コレの読み方wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- 【悲報】ジャップ、日中戦争に賛成が5割弱...軍歌の音が聞こえる... [856698234]
- 関西住みのニューハーフ、彼氏が欲しくて泣く
- 俺も猫か犬と布団で寝たい
