結局C++とRustってどっちが良いの?
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2023/02/25(土) 09:49:46.74ID:VRyB88xR C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
763デフォルトの名無しさん
2023/03/30(木) 12:23:51.98ID:8gDdaVz7 >>762
それだとShapeが型ではなく名前空間になってしまってるからダメでしょ
それだとShapeが型ではなく名前空間になってしまってるからダメでしょ
764デフォルトの名無しさん
2023/03/30(木) 12:29:16.05ID:wHEiYRW7 >>763
namespaceをstructに置換して最後に;つければ?
namespaceをstructに置換して最後に;つければ?
765デフォルトの名無しさん
2023/03/30(木) 12:32:22.56ID:8gDdaVz7 >>764
それだと全ての図形で必要となるメモリサイズの合計サイズが必要になっちゃうよ
それだと全ての図形で必要となるメモリサイズの合計サイズが必要になっちゃうよ
766デフォルトの名無しさん
2023/03/30(木) 12:32:39.23ID:wHEiYRW7 関数はstaticにする
767デフォルトの名無しさん
2023/03/30(木) 12:34:53.74ID:wHEiYRW7 >>765
何か問題でも?
何か問題でも?
768デフォルトの名無しさん
2023/03/30(木) 12:35:39.04ID:7YA3tv0i >>765
メンバ型定義しただけではメンバ変数は増えないから、サイズも増えないよ
メンバ型定義しただけではメンバ変数は増えないから、サイズも増えないよ
769デフォルトの名無しさん
2023/03/30(木) 12:35:54.76ID:wHEiYRW7770デフォルトの名無しさん
2023/03/30(木) 12:47:49.82ID:xP+9HiJo771デフォルトの名無しさん
2023/03/30(木) 12:56:56.84ID:wHEiYRW7 パターンマッチングは便利だけども必須じゃないよね
所有権システムと違って後方互換性が犠牲になることはないので
そのうちC++に入るよ
所有権システムと違って後方互換性が犠牲になることはないので
そのうちC++に入るよ
772デフォルトの名無しさん
2023/03/30(木) 13:16:45.82ID:tVTq+AM2 >>769
パターンマッチング>>748の2番目の例の話だからShapeは関数に渡ってくる型じゃないとまずい
単体で動くコードで比較すればはっきりすると思うのでC++版を書いて。以下はRust版
// ここは再掲
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:?}です"),
}
}
#[derive(Debug)]
enum Shape {
Circle(u32),
Rectangle(u32, u32),
Parallelogram(u32, u32),
}
fn main() {
enum_pattern(Shape::Circle(100));
enum_pattern(Shape::Rectangle(200, 300));
enum_pattern(Shape::Rectangle(567, 567));
enum_pattern(Shape::Parallelogram(789, 456));
}
// 実行結果
半径100の円です
幅200高さ300の長方形です
長さ567の正方形です
その他の図形Parallelogram(789, 456)です
パターンマッチング>>748の2番目の例の話だからShapeは関数に渡ってくる型じゃないとまずい
単体で動くコードで比較すればはっきりすると思うのでC++版を書いて。以下はRust版
// ここは再掲
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:?}です"),
}
}
#[derive(Debug)]
enum Shape {
Circle(u32),
Rectangle(u32, u32),
Parallelogram(u32, u32),
}
fn main() {
enum_pattern(Shape::Circle(100));
enum_pattern(Shape::Rectangle(200, 300));
enum_pattern(Shape::Rectangle(567, 567));
enum_pattern(Shape::Parallelogram(789, 456));
}
// 実行結果
半径100の円です
幅200高さ300の長方形です
長さ567の正方形です
その他の図形Parallelogram(789, 456)です
773デフォルトの名無しさん
2023/03/30(木) 13:28:40.22ID:wHEiYRW7774デフォルトの名無しさん
2023/03/30(木) 13:31:04.03ID:wHEiYRW7775デフォルトの名無しさん
2023/03/30(木) 13:31:12.50ID:tVTq+AM2776デフォルトの名無しさん
2023/03/30(木) 13:32:51.26ID:wHEiYRW7777デフォルトの名無しさん
2023/03/30(木) 13:35:28.76ID:wHEiYRW7 図形は典型的なオブジェクト指向の例題だから
enumを使う例としては適切ではないんじゃないかな?
Rustをよく知らん俺からしたらピンとこないよ
enumを使う例としては適切ではないんじゃないかな?
Rustをよく知らん俺からしたらピンとこないよ
778デフォルトの名無しさん
2023/03/30(木) 13:39:12.89ID:8gDdaVz7 >>774
ディスパッチは静的には不可能で動的にしか行われないでしょ
静的に可能なのはモノモーフィゼイションだけど今回の例では適用できませんね
いずれにしてもC++で可能だと言うコードを示してみたら?
ディスパッチは静的には不可能で動的にしか行われないでしょ
静的に可能なのはモノモーフィゼイションだけど今回の例では適用できませんね
いずれにしてもC++で可能だと言うコードを示してみたら?
779デフォルトの名無しさん
2023/03/30(木) 13:39:52.45ID:PJ70lfxq お、俺の>>761をだな。。
780デフォルトの名無しさん
2023/03/30(木) 13:41:01.47ID:wHEiYRW7781デフォルトの名無しさん
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:EUO40WZ7■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★4 [Hitzeschleier★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- コウメ太夫のネタ考えたから評価してくれ
- トランプ、G7に代わるcore 5を発表 [805596214]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 誰か♪アナルスティック♪舐めて♪
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
