探検
結局C++とRustってどっちが良いの?
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2023/02/25(土) 09:49:46.74ID:VRyB88xR C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
781デフォルトの名無しさん
2023/03/30(木) 13:42:20.94ID:7YA3tv0i https://wandbox.org/permlink/Q94E20qAAS5G8iiX
std::variantとstd::visitでパターンマッチする例です
std::variantとstd::visitでパターンマッチする例です
782デフォルトの名無しさん
2023/03/30(木) 13:52:02.49ID:tVTq+AM2783デフォルトの名無しさん
2023/03/30(木) 14:01:06.19ID:7YA3tv0i >>782
enumのバリアント判定に相当するパターンマッチを行っていますので、全く行っていないという指摘は正しくありません
また、>>748のenum_patternにShape::Rectangle(100, h)にマッチするコードは含まれておらず、あなたの当初の要求に含まれていないものです
新しい要求を後から追加して批判するのは、誠実な態度とは言えません
このようなことが無いように、「何が無理か」を明確にするよう確認したつもりでした
今後はこうしたことが無いように、事前よく確認することをお願い申し上げます
また値によるマッチについてですが、同様の考えで似たライブラリを実装された方を見つけました
こちらは値によるマッチに拡張したライブラリを実装されているようです
https://qiita.com/Naotonosato/items/a1e710de2b78346146d1
enumのバリアント判定に相当するパターンマッチを行っていますので、全く行っていないという指摘は正しくありません
また、>>748のenum_patternにShape::Rectangle(100, h)にマッチするコードは含まれておらず、あなたの当初の要求に含まれていないものです
新しい要求を後から追加して批判するのは、誠実な態度とは言えません
このようなことが無いように、「何が無理か」を明確にするよう確認したつもりでした
今後はこうしたことが無いように、事前よく確認することをお願い申し上げます
また値によるマッチについてですが、同様の考えで似たライブラリを実装された方を見つけました
こちらは値によるマッチに拡張したライブラリを実装されているようです
https://qiita.com/Naotonosato/items/a1e710de2b78346146d1
784デフォルトの名無しさん
2023/03/30(木) 14:04:54.89ID:8gDdaVz7785デフォルトの名無しさん
2023/03/30(木) 14:14:54.28ID:wHEiYRW7 >>782
別に関数プロトタイプまで書いてるんだから分かりそうなものだけど...
以下は静的ディスパッチでコンパイル時に定まるよ
>>772が静的ディスパッチできないとしても
たぶん同じように書けばRustでも静的にディスパッチできると思うよ
#include <iostream>
using namespace std;
namespace Shape {
struct Circle {uint32_t r;};
struct Rectangle {uint32_t w; uint32_t h;};
struct Parallelogram {uint32_t ui0; uint32_t ui1;};
template <typename T> void function (ostream &os, const T &p) {}
void function (ostream &os, const Circle &p) {}
void function (ostream &os, const Rectangle &p) {}
}
int main () {
using namespace Shape;
Circle circle;
function (cout, circle);
Parallelogram parallelogram;
function (cout, parallelogram);
return 0;
}
別に関数プロトタイプまで書いてるんだから分かりそうなものだけど...
以下は静的ディスパッチでコンパイル時に定まるよ
>>772が静的ディスパッチできないとしても
たぶん同じように書けばRustでも静的にディスパッチできると思うよ
#include <iostream>
using namespace std;
namespace Shape {
struct Circle {uint32_t r;};
struct Rectangle {uint32_t w; uint32_t h;};
struct Parallelogram {uint32_t ui0; uint32_t ui1;};
template <typename T> void function (ostream &os, const T &p) {}
void function (ostream &os, const Circle &p) {}
void function (ostream &os, const Rectangle &p) {}
}
int main () {
using namespace Shape;
Circle circle;
function (cout, circle);
Parallelogram parallelogram;
function (cout, parallelogram);
return 0;
}
786デフォルトの名無しさん
2023/03/30(木) 14:47:32.70ID:Evbafc70 静的ではなくて動的ディスパッチだろ
このように次々と何が来るかわからないリストが渡ってきた場合
Shape::Shape shape_list[4];
shape_list[0] = Shape::Rectangle{w: 33, h: 33};
shape_list[1] = Shape::Parallelogram{ui0: 4, ui1: 33};
shape_list[2] = Shape::Rectangle{w: 33, h: 4};
shape_list[3] = Shape::Circle{10};
その時にこれで処理できるのだから動的ディスパッチをしている
for (int i = 0; i < 4; i++) {
enum_pattern(shape_list[i]);
}
このように次々と何が来るかわからないリストが渡ってきた場合
Shape::Shape shape_list[4];
shape_list[0] = Shape::Rectangle{w: 33, h: 33};
shape_list[1] = Shape::Parallelogram{ui0: 4, ui1: 33};
shape_list[2] = Shape::Rectangle{w: 33, h: 4};
shape_list[3] = Shape::Circle{10};
その時にこれで処理できるのだから動的ディスパッチをしている
for (int i = 0; i < 4; i++) {
enum_pattern(shape_list[i]);
}
787デフォルトの名無しさん
2023/03/30(木) 15:01:18.46ID:wHEiYRW7788デフォルトの名無しさん
2023/03/30(木) 15:04:41.33ID:PJ70lfxq もうちょっと調べてたが、C++にもinspectってのが来そうみたいじゃん
パタンマッチングって、こんなもんが流行ってるのね、また一つ取り残されてたぜ
パタンマッチングって、こんなもんが流行ってるのね、また一つ取り残されてたぜ
789デフォルトの名無しさん
2023/03/30(木) 15:04:46.89ID:7YA3tv0i >>786
いいえ、これは静的ディスパッチです
簡単に確認する方法として、生成されたアセンブリ中のvtableを確認する方法があります:
https://godbolt.org/z/1W7jGnWEd
"vtable for std::bad_variant_access:"が唯一のvtableであり、Circleなどのためのvtableはありません
このことから、動的ディスパッチは発生しないことが分かります
いいえ、これは静的ディスパッチです
簡単に確認する方法として、生成されたアセンブリ中のvtableを確認する方法があります:
https://godbolt.org/z/1W7jGnWEd
"vtable for std::bad_variant_access:"が唯一のvtableであり、Circleなどのためのvtableはありません
このことから、動的ディスパッチは発生しないことが分かります
790デフォルトの名無しさん
2023/03/30(木) 15:09:53.24ID:Evbafc70791デフォルトの名無しさん
2023/03/30(木) 15:10:42.88ID:wHEiYRW7792デフォルトの名無しさん
2023/03/30(木) 15:12:35.47ID:wHEiYRW7 >>790
それはRsutのコードか? C++のコードか?
それはRsutのコードか? C++のコードか?
793デフォルトの名無しさん
2023/03/30(木) 15:20:37.87ID:Evbafc70 >>792
そのC++コードの話しかしていない
そのC++コードの話しかしていない
794デフォルトの名無しさん
2023/03/30(木) 15:23:32.35ID:78T5MT6s795デフォルトの名無しさん
2023/03/30(木) 15:29:45.34ID:7YA3tv0i >>790
いいえ
動的ディスパッチとは、多態メソッドの呼び出し式を実行するときに、具体型に応じて実際に呼ばれる関数が振り分けられることを言います
https://en.wikipedia.org/wiki/Dynamic_dispatch
動的ディスパッチはしばしばパフォーマンスの低下をもたらすと言われますが、その最大の理由は、
選択される各関数ポインタを一度メモリから(vtableから)読み出し、それをcallする必要があることです
動的ディスパッチをどう定義するかはさておき、vtableが無い>>789ではこのパフォーマンス低下の懸念が無いことが分かります
また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
これは、この定義が一般的な定義から大きく逸脱していることをよく象徴的に表わしています
少なくとも「データ内容」は「型」に置き換える必要があることが分かるでしょう
いいえ
動的ディスパッチとは、多態メソッドの呼び出し式を実行するときに、具体型に応じて実際に呼ばれる関数が振り分けられることを言います
https://en.wikipedia.org/wiki/Dynamic_dispatch
動的ディスパッチはしばしばパフォーマンスの低下をもたらすと言われますが、その最大の理由は、
選択される各関数ポインタを一度メモリから(vtableから)読み出し、それをcallする必要があることです
動的ディスパッチをどう定義するかはさておき、vtableが無い>>789ではこのパフォーマンス低下の懸念が無いことが分かります
また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
これは、この定義が一般的な定義から大きく逸脱していることをよく象徴的に表わしています
少なくとも「データ内容」は「型」に置き換える必要があることが分かるでしょう
796デフォルトの名無しさん
2023/03/30(木) 15:38:08.65ID:RiLc+pIf797デフォルトの名無しさん
2023/03/30(木) 15:39:00.20ID:PJ70lfxq >>791
inspectは、godboltでclangのexperimentalを遊べるようになってた
型に対しては、もうちょっとまだみたい、error: expected expression って言われた
ラムダみたいに、みんなが欲しがるものはそれでもわりと早いんだよね
一応入れとくか…みたいのは、いつまでたっても入らないw
ところで、godboltに、-Wlifetime ってのがみえたけど…これってもしかして
inspectは、godboltでclangのexperimentalを遊べるようになってた
型に対しては、もうちょっとまだみたい、error: expected expression って言われた
ラムダみたいに、みんなが欲しがるものはそれでもわりと早いんだよね
一応入れとくか…みたいのは、いつまでたっても入らないw
ところで、godboltに、-Wlifetime ってのがみえたけど…これってもしかして
798デフォルトの名無しさん
2023/03/30(木) 15:59:56.98ID:QNJ4BihP C++の仕様を変えようという時に国語辞典の変更を許さないのはタイパ最悪だな
C++の仕様変更を許さない、とすれば秒速で終わる
C++の仕様変更を許さない、とすれば秒速で終わる
799デフォルトの名無しさん
2023/03/30(木) 16:08:41.30ID:7YA3tv0i800デフォルトの名無しさん
2023/03/30(木) 16:15:52.14ID:tFh1pq1g このスレレベル高いね。
文系の俺にはちんぷんかんぷん。
雑魚はPHPでもしてるわ。
文系の俺にはちんぷんかんぷん。
雑魚はPHPでもしてるわ。
801デフォルトの名無しさん
2023/03/30(木) 16:26:34.28ID:8gDdaVz7 Rustはそのへんの話も明瞭で
「dyn」という予約語キーワードが出てきたものだけがvtableを使う動的ディスパッチとなるよ
>>772のRustコードは「dyn」が全く出てこないので、vtableを使う動的ディスパッチは一切無し、とわかる仕組み
「dyn」という予約語キーワードが出てきたものだけがvtableを使う動的ディスパッチとなるよ
>>772のRustコードは「dyn」が全く出てこないので、vtableを使う動的ディスパッチは一切無し、とわかる仕組み
802デフォルトの名無しさん
2023/03/30(木) 16:30:55.38ID:MJaavB8R >>800
レベル高すぎてディスパッチが動的かどうかすらわからないからなwww
レベル高すぎてディスパッチが動的かどうかすらわからないからなwww
803デフォルトの名無しさん
2023/03/30(木) 16:39:07.20ID:PJ70lfxq 静的にディスパッチできたらいいのか、動的にディスパッチしたいのか。なんていうかgdgd ww
804デフォルトの名無しさん
2023/03/30(木) 17:58:32.57ID:/NM1S7ef >>800
ここは「朝から暇なおじさんの学習日記」だからある意味レベル高い。
ここは「朝から暇なおじさんの学習日記」だからある意味レベル高い。
805デフォルトの名無しさん
2023/03/30(木) 17:59:31.96ID:7YA3tv0i806デフォルトの名無しさん
2023/03/30(木) 18:59:14.51ID:7YA3tv0i807デフォルトの名無しさん
2023/03/30(木) 19:20:59.17ID:DvxUCrw+808デフォルトの名無しさん
2023/03/30(木) 20:49:12.26ID:jpK8yCqo >>807
Rustのenumのmatchはenumのインデックスで分岐してるだけ
C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
どちらも動的ディスパッチはしていない
Rustのenumのmatchはenumのインデックスで分岐してるだけ
C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
どちらも動的ディスパッチはしていない
809デフォルトの名無しさん
2023/03/30(木) 20:53:37.26ID:wHEiYRW7 条件分岐は動的ディスパッチという
実行時ディスパッチと言った方が意味分かるかな?
実行時ディスパッチと言った方が意味分かるかな?
810デフォルトの名無しさん
2023/03/30(木) 20:55:04.82ID:wHEiYRW7 動的ディスパッチというのは
インデックスによる条件分岐
仮想関数によるディスパッチを含む広い概念です
インデックスによる条件分岐
仮想関数によるディスパッチを含む広い概念です
811デフォルトの名無しさん
2023/03/30(木) 20:57:43.19ID:wHEiYRW7 Rustも関数のオーバーロードくらいあるだろ?
コンパイル段階でどの関数が呼ばれるかディスパッチされる
これが静的ディスパッチ(の1つ)
コンパイル段階でどの関数が呼ばれるかディスパッチされる
これが静的ディスパッチ(の1つ)
812デフォルトの名無しさん
2023/03/30(木) 21:00:36.55ID:jpK8yCqo813デフォルトの名無しさん
2023/03/30(木) 21:07:23.31ID:wHEiYRW7814デフォルトの名無しさん
2023/03/30(木) 21:29:24.91ID:c1ax4GEO これらはvtableを使うわけでもないし動的ディスパッチじゃないでしょ
> Rustのenumのmatchはenumのインデックスで分岐してるだけ
> C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
> どちらも動的ディスパッチはしていない
> Rustのenumのmatchはenumのインデックスで分岐してるだけ
> C++のvariantのvisitがvariantのインデックスで分岐してるだけなのと同じ
> どちらも動的ディスパッチはしていない
815デフォルトの名無しさん
2023/03/30(木) 21:42:01.94ID:wHEiYRW7 >>814
>>772
>fn enum_pattern(shape: Shape) {
> match shape {
> Shape::Circle(r) => println!("半径{r}の円です"),
> Shape::Rectangle(w, h) if w == h => println!("長さ{w}の正方形です"),
> Shape::Rectangle(w, h) => println!("幅{w}高さ{h}の長方形です"),
> x => println!("その他の図形{x:?}です"),
> }
>}
ShapeがCircleなのかw == hであるRectangle(w, h)なのかそれ以外のRectangleなのか
それともそれらに該当しないのかは実行時に決めているので
動的ディスパッチだよ
>>772
>fn enum_pattern(shape: Shape) {
> match shape {
> Shape::Circle(r) => println!("半径{r}の円です"),
> Shape::Rectangle(w, h) if w == h => println!("長さ{w}の正方形です"),
> Shape::Rectangle(w, h) => println!("幅{w}高さ{h}の長方形です"),
> x => println!("その他の図形{x:?}です"),
> }
>}
ShapeがCircleなのかw == hであるRectangle(w, h)なのかそれ以外のRectangleなのか
それともそれらに該当しないのかは実行時に決めているので
動的ディスパッチだよ
816デフォルトの名無しさん
2023/03/30(木) 21:45:16.53ID:wHEiYRW7 一方で
>>785
>namespace Shape {
> struct Circle {uint32_t r;};
> struct Rectangle {uint32_t w; uint32_t h;};
> struct Parallelogram {uint32_t ui0; uint32_t ui1;};
> template <typename T> void function (ostream &os, const T &p) {}
> void function (ostream &os, const Circle &p) {}
> void function (ostream &os, const Rectangle &p) {}
>}
上記のどのfunctionが呼ばれるかは型に基づいてコンパイル時に選択される
これが静的ディスパッチ
>>785
>namespace Shape {
> struct Circle {uint32_t r;};
> struct Rectangle {uint32_t w; uint32_t h;};
> struct Parallelogram {uint32_t ui0; uint32_t ui1;};
> template <typename T> void function (ostream &os, const T &p) {}
> void function (ostream &os, const Circle &p) {}
> void function (ostream &os, const Rectangle &p) {}
>}
上記のどのfunctionが呼ばれるかは型に基づいてコンパイル時に選択される
これが静的ディスパッチ
817デフォルトの名無しさん
2023/03/30(木) 21:53:29.79ID:5+VTvxRF じゃあ>>789のC++コードは動的ディスパッチなの?
vtableは無いしstd::visitでvariantのindex()値を見て実行時に分岐してるだけだから静的ディスパッチだと書かれているけど
vtableは無いしstd::visitでvariantのindex()値を見て実行時に分岐してるだけだから静的ディスパッチだと書かれているけど
818デフォルトの名無しさん
2023/03/30(木) 21:54:22.26ID:BpzIAh0K ID:wHEiYRW7は一つのIDを一貫して使ってるのに対し
それにあほなレスつけて食って掛かってるほうはIDコロコロなんで
草も生えない毎度毎度のいつもの百年前から一生やってるrustスレ名物展開
それにあほなレスつけて食って掛かってるほうはIDコロコロなんで
草も生えない毎度毎度のいつもの百年前から一生やってるrustスレ名物展開
819デフォルトの名無しさん
2023/03/30(木) 21:57:54.63ID:wHEiYRW7820デフォルトの名無しさん
2023/03/30(木) 21:58:56.34ID:nbxN6jLH821デフォルトの名無しさん
2023/03/30(木) 22:04:55.93ID:k5ePvr4k822デフォルトの名無しさん
2023/03/30(木) 22:06:13.90ID:wHEiYRW7 >>795
>また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
>それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
何だそりゃ?w この説明の方が明らかにおかしい
>また、「実行時にデータ内容に応じて分岐することを動的ディスパッチと言う」という定義には明らかな問題があります
>それは、この定義ではmatchやifなど通常の制御構造も動的ディスパッチに当てはまってしまうということです
何だそりゃ?w この説明の方が明らかにおかしい
823デフォルトの名無しさん
2023/03/30(木) 22:08:44.12ID:7YA3tv0i 他人に教えてもらったばっかりの内容で偉そうにしてんじゃねえ
824デフォルトの名無しさん
2023/03/30(木) 22:09:30.46ID:wHEiYRW7825デフォルトの名無しさん
2023/03/30(木) 22:11:02.64ID:8gDdaVz7 C++のvariantやRustのenumの値で条件分岐することを動的ディスパッチというのは無理があるんじゃないかな
それはif文を使ったら動的ディスパッチと言ってるようなもの
それはif文を使ったら動的ディスパッチと言ってるようなもの
826デフォルトの名無しさん
2023/03/30(木) 22:11:20.94ID:PJ70lfxq まだやってら
どっちが来てもおっけーなようにtemplate<>が書けるのがC++のOOPだろ
無駄な議論 Rustもそんな感じだろ?w
どっちが来てもおっけーなようにtemplate<>が書けるのがC++のOOPだろ
無駄な議論 Rustもそんな感じだろ?w
827デフォルトの名無しさん
2023/03/30(木) 22:12:32.19ID:PJ70lfxq っていうか、お、俺の>>761をだな。。
828デフォルトの名無しさん
2023/03/30(木) 22:17:03.62ID:PQ2EGsE8 どっちも動的ディスパッチじゃなくね
コンパイル後のenum_patternにCircleでもRectangleでもRectangleでもなく
HogeAngleぶち込んでもディスパッチしてくれるのが動的じゃないの?
コンパイル後のenum_patternにCircleでもRectangleでもRectangleでもなく
HogeAngleぶち込んでもディスパッチしてくれるのが動的じゃないの?
829デフォルトの名無しさん
2023/03/30(木) 22:18:51.34ID:wHEiYRW7830デフォルトの名無しさん
2023/03/30(木) 22:20:12.37ID:BpzIAh0K 静的じゃないものは動的でいいと思うけど
ディスパッチディスパッチ言ってんのは関数だけを前提にしたほうがいいんじゃない?
match についてはもとの?ディスパッチ話から分離させたほうがいいかも?
それとも元々matchの話なんだっけ? 最初の方読んでないけど
今まで関数かメソッド以外の文脈でディスパッチとか聞いたことなかったわ個人的に
ディスパッチディスパッチ言ってんのは関数だけを前提にしたほうがいいんじゃない?
match についてはもとの?ディスパッチ話から分離させたほうがいいかも?
それとも元々matchの話なんだっけ? 最初の方読んでないけど
今まで関数かメソッド以外の文脈でディスパッチとか聞いたことなかったわ個人的に
831デフォルトの名無しさん
2023/03/30(木) 22:22:08.75ID:PJ70lfxq C++erは、書いたコードがディスパッチになるかは常に気にしてるからね(諸派あり
そこを雑に書くと、ぶん殴られたりするからw
だから、Rustの、書けばsafeになるってのは、欲しいんだなあ
生成コードに集中できる
そこを雑に書くと、ぶん殴られたりするからw
だから、Rustの、書けばsafeになるってのは、欲しいんだなあ
生成コードに集中できる
832デフォルトの名無しさん
2023/03/30(木) 22:23:47.54ID:7lKP8BwD 百科事典で調べてみた
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
この定義だとC++のvariant/visitでの分岐やRustのenum/matchでの分岐は動的ディスパッチではないな
一方でC++のvirtual関数やRustのdynトレイトは動的ディスパッチとなる
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
この定義だとC++のvariant/visitでの分岐やRustのenum/matchでの分岐は動的ディスパッチではないな
一方でC++のvirtual関数やRustのdynトレイトは動的ディスパッチとなる
833デフォルトの名無しさん
2023/03/30(木) 22:27:18.66ID:wHEiYRW7 >>832
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
これは動的ディスパッチの1つで
実行時に条件分岐して呼ぶ関数を決めるのも動的ディスパッチと呼ぶ
仮想関数によるディスパッチより動的ディスパッチの方が広い概念だよ
>> https://www.weblio.jp/content/%E5%8B%95%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E4%BE%8B
>> C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、
>> 実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。
>> これを動的ディスパッチと呼ぶ。
これは動的ディスパッチの1つで
実行時に条件分岐して呼ぶ関数を決めるのも動的ディスパッチと呼ぶ
仮想関数によるディスパッチより動的ディスパッチの方が広い概念だよ
834デフォルトの名無しさん
2023/03/30(木) 22:39:32.69ID:Zoz9Js1j 横からすみません
Rustで日常茶飯事のこのパターンは動的ディスパッチですか?
let output = match input {
Some(input) => foo(input),
None => Default::default(),
};
Rustで日常茶飯事のこのパターンは動的ディスパッチですか?
let output = match input {
Some(input) => foo(input),
None => Default::default(),
};
835デフォルトの名無しさん
2023/03/30(木) 22:47:00.93ID:PJ70lfxq ジャンプテーブルがあれば、それはディスパッチ
836デフォルトの名無しさん
2023/03/30(木) 22:56:12.40ID:7YA3tv0i >>827
何があれば「実践的」と言えるかの条件と、そもそも何のサンプルが欲しいのか、を明確にしないと誰も何も出せないよ
何があれば「実践的」と言えるかの条件と、そもそも何のサンプルが欲しいのか、を明確にしないと誰も何も出せないよ
837デフォルトの名無しさん
2023/03/30(木) 22:56:26.39ID:8gDdaVz7 >>772はジャンプテーブルがないから動的ディスパッチじゃない
838デフォルトの名無しさん
2023/03/30(木) 22:58:11.58ID:8gDdaVz7839デフォルトの名無しさん
2023/03/30(木) 23:11:54.75ID:wHEiYRW7 >>838
俺はRust分からんのだけど
これinputがSome(input)に適合するかしないかを
実行時に判断しているんやろ? だとしたら動的ディスパッチだよ
C++のtemplateみたいに上記をコンパイル時に判断して
例えばSome(input)に適合するからDefault::default()を
コールするコードが生成されないようなら静的ディスパッチ
俺はRust分からんのだけど
これinputがSome(input)に適合するかしないかを
実行時に判断しているんやろ? だとしたら動的ディスパッチだよ
C++のtemplateみたいに上記をコンパイル時に判断して
例えばSome(input)に適合するからDefault::default()を
コールするコードが生成されないようなら静的ディスパッチ
840デフォルトの名無しさん
2023/03/30(木) 23:16:28.37ID:PJ70lfxq841デフォルトの名無しさん
2023/03/30(木) 23:17:10.18ID:7YA3tv0i というか>>789の「静的ディスパッチ」もよく考えたら誤用だったわ
https://en.wikipedia.org/wiki/Static_dispatch
Rustならtrait bound付きgenerics内のtrait method呼び出しのことで良さそうだけど
C++なら……ちょっとこのwikipediaの定義もなぜかオーバーロードに限定しててビミョ〜
これはRust以外の文脈では合意された定義無い気がする
https://en.wikipedia.org/wiki/Static_dispatch
Rustならtrait bound付きgenerics内のtrait method呼び出しのことで良さそうだけど
C++なら……ちょっとこのwikipediaの定義もなぜかオーバーロードに限定しててビミョ〜
これはRust以外の文脈では合意された定義無い気がする
842デフォルトの名無しさん
2023/03/30(木) 23:21:08.11ID:BpzIAh0K 静的か動的かはお互い認識にズレ無いと思うんよね
でも「ディスパッチ」って言うとき
言語機能として用意されてる関数オーバーロードやvirtual使ったポリモとか
動的静的に関わらずまぁそこまではディスパッチなんだけど
matchの結果やifの結果となってくるとそれって
言語の機能というより、言語の機能の機能ってことになってて
一気にぼんや〜りとしてくるんで一人一人にズレが生じるよね
でも「ディスパッチ」って言うとき
言語機能として用意されてる関数オーバーロードやvirtual使ったポリモとか
動的静的に関わらずまぁそこまではディスパッチなんだけど
matchの結果やifの結果となってくるとそれって
言語の機能というより、言語の機能の機能ってことになってて
一気にぼんや〜りとしてくるんで一人一人にズレが生じるよね
843デフォルトの名無しさん
2023/03/30(木) 23:21:22.01ID:PQ2EGsE8 1.どの振る舞いをするかがコンパイル時に選択される構造
2.どの振る舞いをするかが動的に選択される構造
3.振る舞いが追加されても動的に選択できる構造
パターンマッチは振る舞いの選択の話だから2
ポリモーフィズムを語る上での動的ディスパッチは3
2を動的ディスパッチと呼ぶかどうか
2.どの振る舞いをするかが動的に選択される構造
3.振る舞いが追加されても動的に選択できる構造
パターンマッチは振る舞いの選択の話だから2
ポリモーフィズムを語る上での動的ディスパッチは3
2を動的ディスパッチと呼ぶかどうか
844デフォルトの名無しさん
2023/03/30(木) 23:22:10.90ID:Zoz9Js1j >>839
実行時にならないとSomeかNoneかわからないからプログラムを組むんですよ
コンパイル時点で決まっていたらプログラムを組む意味がありません
そしてプログラムを組めば必ずどこかに条件分岐があります
それを動的ディスパッチとは言わないと思うんです
実行時にならないとSomeかNoneかわからないからプログラムを組むんですよ
コンパイル時点で決まっていたらプログラムを組む意味がありません
そしてプログラムを組めば必ずどこかに条件分岐があります
それを動的ディスパッチとは言わないと思うんです
845デフォルトの名無しさん
2023/03/30(木) 23:23:46.15ID:7YA3tv0i846デフォルトの名無しさん
2023/03/30(木) 23:23:58.24ID:wHEiYRW7 >>841
>This contrasts with dynamic dispatch, which is based on runtime information
> (such as vtable pointers and other forms of run time type information).
そこにdynamic dispatchを説明する一文があって2行目()内の
and以下に書かれているのがまさにifやmatchで評価していること
>This contrasts with dynamic dispatch, which is based on runtime information
> (such as vtable pointers and other forms of run time type information).
そこにdynamic dispatchを説明する一文があって2行目()内の
and以下に書かれているのがまさにifやmatchで評価していること
847デフォルトの名無しさん
2023/03/30(木) 23:27:47.63ID:BpzIAh0K848デフォルトの名無しさん
2023/03/30(木) 23:29:52.13ID:Zoz9Js1j849デフォルトの名無しさん
2023/03/30(木) 23:30:14.28ID:PJ70lfxq850デフォルトの名無しさん
2023/03/30(木) 23:31:40.58ID:wHEiYRW7851デフォルトの名無しさん
2023/03/30(木) 23:33:00.14ID:7YA3tv0i >>846
それはjsとかRubyとかPythonではvtableじゃなくてハッシュテーブルを使ってメソッド呼び出ししてるって意味ですよ
それはjsとかRubyとかPythonではvtableじゃなくてハッシュテーブルを使ってメソッド呼び出ししてるって意味ですよ
852デフォルトの名無しさん
2023/03/30(木) 23:36:51.72ID:wHEiYRW7853デフォルトの名無しさん
2023/03/30(木) 23:39:51.85ID:Zoz9Js1j854デフォルトの名無しさん
2023/03/30(木) 23:42:50.15ID:7YA3tv0i >>849
rust-lang/rustのありそうなところからテキトーに拾ったけどこれとかどうすかね
https://github.com/rust-lang/rust/blob/master/compiler/rustc_ast/src/visit.rs#L302
rust-lang/rustのありそうなところからテキトーに拾ったけどこれとかどうすかね
https://github.com/rust-lang/rust/blob/master/compiler/rustc_ast/src/visit.rs#L302
855デフォルトの名無しさん
2023/03/30(木) 23:46:30.65ID:PJ70lfxq856デフォルトの名無しさん
2023/03/30(木) 23:46:56.95ID:wHEiYRW7857デフォルトの名無しさん
2023/03/30(木) 23:49:02.99ID:7YA3tv0i858デフォルトの名無しさん
2023/03/30(木) 23:49:55.47ID:8gDdaVz7 結局まとめるとこうかな?
静的ディスパッチ ← 静的に型情報が決まる場合にコンパイル時に呼び出しメソッドが確定すること
動的ディスパッチ ← 動的に型情報が決まる場合に実行時に呼び出しメソッドが確定すること
Rustのmatch文でのenumの分岐は静的に型情報は確定しているけど呼び出しメソッドを決めるわけではないので静的ディスパッチではない
Rustのmatch文でのenumの分岐は静的に型情報は確定しているため動的に型情報が決まる動的ディスパッチとは無縁
つまりRustのmatch文でのenumの分岐はどちらのディスパッチでもなく一つの型の中の値による条件分岐にすぎない
静的ディスパッチ ← 静的に型情報が決まる場合にコンパイル時に呼び出しメソッドが確定すること
動的ディスパッチ ← 動的に型情報が決まる場合に実行時に呼び出しメソッドが確定すること
Rustのmatch文でのenumの分岐は静的に型情報は確定しているけど呼び出しメソッドを決めるわけではないので静的ディスパッチではない
Rustのmatch文でのenumの分岐は静的に型情報は確定しているため動的に型情報が決まる動的ディスパッチとは無縁
つまりRustのmatch文でのenumの分岐はどちらのディスパッチでもなく一つの型の中の値による条件分岐にすぎない
859デフォルトの名無しさん
2023/03/31(金) 00:03:18.59ID:EUO40WZ7 >>858
型情報による条件分岐に限らず値による条件分岐も動的ディスパッチだよ
なぜならC++の場合typeid演算子で取ったtypeinfoオブジェクトで条件分岐したら
それは型情報なのか値なのか?両者に差はないから
型情報による条件分岐に限らず値による条件分岐も動的ディスパッチだよ
なぜならC++の場合typeid演算子で取ったtypeinfoオブジェクトで条件分岐したら
それは型情報なのか値なのか?両者に差はないから
860デフォルトの名無しさん
2023/03/31(金) 00:05:54.81ID:EUO40WZ7861デフォルトの名無しさん
2023/03/31(金) 00:10:50.53ID:yzNtfP1n >>859
この場合のディスパッチとは型情報に基づいて呼び出しメソッドを決定すること
それが静的に決まれば静的ディスパッチ
そして動的に決まれば動的ディスパッチ
型情報に基づかなければ単なる昔からの条件分岐プログラム
typeidで得られるのは型情報なのでtypeidに基づくならば動的ディスパッチに該当する
この場合のディスパッチとは型情報に基づいて呼び出しメソッドを決定すること
それが静的に決まれば静的ディスパッチ
そして動的に決まれば動的ディスパッチ
型情報に基づかなければ単なる昔からの条件分岐プログラム
typeidで得られるのは型情報なのでtypeidに基づくならば動的ディスパッチに該当する
862デフォルトの名無しさん
2023/03/31(金) 00:12:47.70ID:4rLmkYuJ 条件分岐は条件分岐でしかない
ディスパッチは条件分岐を用いずに振る舞いを切り替えること
ディスパッチは条件分岐を用いずに振る舞いを切り替えること
863デフォルトの名無しさん
2023/03/31(金) 00:14:06.22ID:EUO40WZ7864デフォルトの名無しさん
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++では違うんだよね
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市早苗総理「金利上昇よりも日本の成長が大事」 ★2 [Hitzeschleier★]
- かつや、明日からカツ丼(竹)790円→590円、ロースカツ定食830円→630円、カツカレー(竹)990円→790円 画像あり [お断り★]
- 【将棋】福間香奈 女流六冠が会見 妊娠・出産でタイトル戦の事実上不戦敗 「妊娠したら、どちらか一方を諦めないといけない状況」 [冬月記者★]
- タイがカンボジアを空爆、トランプ氏仲介の和平合意は“事実上崩壊”軍事衝突へ タイ首相「もはや対話の余地ない」 [お断り★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★3 [Hitzeschleier★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★2 [Hitzeschleier★]
- 防衛省「了解は言っていない」 [966095474]
- 【速報】共同通信スクープキタ━(゚∀゚)━!!「実際は日本の自衛隊機が中国機に対してレーダ照射ロックオンしていたことが発覚」 [339712612]
- 【悲報】ジャップ、「ホンビノスガイ」すら食い尽くして絶滅寸前まで追い込む🥹 [616817505]
- 小泉防衛大臣「中国から通告はあったが具体的ではなかった」 [834922174]
- 東京都さん「年間1.5兆円の税金が地方に盗られてまーす!!!!!」 [696684471]
- Vtuberラーメン70%オフwwwwwwwww
