結局C++とRustってどっちが良いの?

レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
垢版 |
2023/02/25(土) 09:49:46.74ID:VRyB88xR
C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
2023/03/31(金) 09:01:13.01ID:RaXhcLNj
>>878
C++でも同じだよ
880デフォルトの名無しさん
垢版 |
2023/03/31(金) 10:05:33.29ID:TtdiO46p
vtableの持ち方がRustとC++では違うんだよね
881デフォルトの名無しさん
垢版 |
2023/03/31(金) 10:09:37.79ID:BBtS0ztF
>>877
SpringやFluxのディスパッチャーだったり
Grand Central Dispatchだったり
何に対しても使える用語だから
区別できてない人もいるんだろう
2023/03/31(金) 11:47:51.48ID:3PkVSivi
C++では、クラスが仮想関数を持つ場合、そのクラスのインスタンスに対して仮想関数テーブルが作成される。
仮想関数テーブルには、仮想関数へのポインタが含まれインスタンスに対して仮想関数が呼び出されるたびに
vtableを参照して適切な関数が呼び出される。

Rustでは動的ディスパッチを実現するためにトレイトオブジェクトが使用される。
トレイトオブジェクトには、traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
インスタンスに対してメソッドが呼び出されるたびに、トレイトオブジェクトが参照され
適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。

結果は同じ。
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:KJ4yMLmS
>>882
クラスとインスタンスの関係を理解してないな
C++の説明もRustの説明も同じように間違ってる
おまえオブジェクト指向を理解してなさそうと言われてたやつだろ
2023/03/31(金) 18:50:12.77ID:Q5ExbgOu
>>882
うーむひどいな
とりあえずRustについて、この部分の間違いはあまりにひどい

> traitオブジェクトが実装する各メソッドに対応するポインタのリストが含まれていて
> 適切なポインタが見つかるまでリストを検索し適切な関数が呼び出される。

Rustは常にメソッドが静的に一意に確定するため、動的ディスパッチでも適切なポインタが見つかるまでリストを検索する必要がない

Rustはメソッド名が衝突する場合、まず自分の定義優先で確定、なくてトレイト間に衝突がなければ確定、衝突があればエラーだが、トレイト名を指定することでどのトレイトのメソッドでも常に利用可能
つまりRustではメソッド呼び出しが自分のメソッドかどのトレイトのメソッドかが静的に一意に確定する

静的ポリモーフィズムとして使われるときは、必要とする最小限のトレイトを列挙(=トレイト境界)するため、メソッドの衝突の可能性は通常時よりも減ったり無くなったりする
いずれにせよ上述したようにメソッドは静的に一意に定まるため、静的ディスパッチでは単相化(モノモーフィゼーション)されてコンパイルされる

動的ポリモーフィズムとして使われるときは、現在の仕様では指定できるトレイトは(auto traitを除き)一つのみに限定されている
ただし必要とするトレイトを列挙(=トレイト境界)したダミーなトレイトを任意に作ることも可能なため、事実上は複数のトレイトを指定できるのと同じ
指定トレイトが一つに限定されているということは、(そのトレイト境界を含めた)トレイト群すべてのメソッドを静的に一斉に把握できることを意味する
つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく、呼び出すメソッドは静的に確定してインデックス値となっているため、動的ディスパッチでも高速にメソッドを呼び出せる
2023/03/31(金) 18:59:29.64ID:Q5ExbgOu
間違ったことを書いてる人は完全に悪いけど、内容があれば議論のネタになるからまだマシ
それに対して間違ってる!とか、虚言!とかだけ言う連中は全く役に立たないから無視してよい
なぜなら、正しいことが書かれている場合でも、間違ってる!とか適当なこと言ったりするだけの連中も多いため
2023/03/31(金) 19:02:37.99ID:RaXhcLNj
>>886
> つまりRustのvtableはその指定トレイト一つのみに定まり、その親や祖先のvtableを辿る必要がなく
C++も同じです
> 動的ディスパッチでも高速にメソッドを呼び出せる
何と比較して?静的に比べりゃどうやったって遅いしそこにC++との差はないはずだし

不合格

>>887
テキトーかどうかの検証のために、出典を貼っていただけるとみんなが助かります
やるつもりが無いなら頃合いを見てマサカリを投げさせていただきます
2023/03/31(金) 19:13:25.65ID:Q5ExbgOu
>>888
そういう意味のない言いがかりはやめとけ
元の>>882が正しくないこと「適切なポインタが見つかるまでリストを検索」と書いているので、
それに対して正しいこと「親や祖先のvtableを辿る必要がなく、動的ディスパッチでも高速にメソッドを呼び出せる」と書いた
そこで「静的に比べりゃどうやったって遅い」と頓珍漢なことを言い出すのは理解力のない証拠
これ以上は相手にしない
2023/03/31(金) 19:25:39.32ID:Wg79uBjg
OpenCV-rs ってもうメンテされてないんか?
gdgd なんだが
2023/03/31(金) 19:29:08.86ID:RaXhcLNj
https://mevius.5ch.net/test/read.cgi/tech/1677286186/751
https://mevius.5ch.net/test/read.cgi/tech/1677286186/756
https://mevius.5ch.net/test/read.cgi/tech/1677286186/786

つまんね〜の、もっとC++の話しようぜ複おじ
また名言バンバン出してくれよ
2023/03/31(金) 19:30:39.96ID:RaXhcLNj
756じゃなくてこっちだった
https://mevius.5ch.net/test/read.cgi/tech/1677286186/765
2023/03/31(金) 19:38:42.25ID:Wg79uBjg
>動的ディスパッチ

もしかして
遅延バインディング
2023/03/31(金) 19:40:08.33ID:7j0Yg6pd
おじオジ言ってる人は頭がおかしいと他のスレで習ったけどここでもそうなの?
2023/03/31(金) 19:59:22.01ID:RaXhcLNj
てかよく読んでみれば>>882自体は「適切なポインタが見つかるまでリストを検索」としか書いてなくて
具体的にどういうリストなのかの説明は一切無し
なのになぜか>>886は「親や祖先のvtableを辿る」と、親子関係でリストができる?のを何故か仮定している

そういうことだよねw
2023/03/31(金) 20:11:31.44ID:EgdFd66u
>>887
「最初から間違ってると思ってた」と事後に言うと、本当に最初からだったのかが真偽不明になるから
内容がなくても時刻を記録するだけで意味があるんだよ
2023/03/31(金) 20:19:56.47ID:f9v7p1HY
祖先のテーブルをたどっていく実装や言語あるよ
特にJavaScriptはメソッドを後から生やせるから大変だった
898デフォルトの名無しさん
垢版 |
2023/03/31(金) 20:24:26.37ID:JGH7phMu
>>896
とりあえず、プライドは高いということは分かった
899デフォルトの名無しさん
垢版 |
2023/03/31(金) 21:01:50.63ID:J9Ac7zVb
>>887
どう見ても君が間違ってる本人じゃん
なぜバレないと思ったの?
900デフォルトの名無しさん
垢版 |
2023/03/31(金) 21:50:12.55ID:RJ6Se/g4
1. 知ったかぶりして嘘をさも本当かのように書き連ねる
2. 間違いを指摘されるとググって必死に正解を探す
3. そしてそんなことは最初から知ってましたというトーンで長文まとめスレを他人のフリして書く

これが複オジメソッド
2023/03/31(金) 22:09:18.69ID:RaXhcLNj
>>900
そして話の内容がC++になると複おじにはちんぷんかんぷんなので
調べても間に合わないし、無限に別の間違いを生み出し続けてしまうというw
2023/03/31(金) 22:18:57.16ID:Q5ExbgOu
>>899
俺が間違ってるって??
>>886に間違ってるところがあるなら指摘してくれ
903デフォルトの名無しさん
垢版 |
2023/03/31(金) 22:43:55.74ID:e2Ah0StU
>>900
4. 他人のふりして書いた長文まとめも間違っている
というオチ付き
2023/03/31(金) 22:50:43.27ID:RaXhcLNj
>>902
その「間違ってる本人」は>>882のことを指していて、間違いがあるのは>>886のことではないと思うが
それはそれとして>>886の間違いを指摘しておくと

あなたC++で「どのvtableを見るべきか」を実行時にしか判断できないケースがあると思ってない? 嘘だよそれ
じゃないと「メソッドの衝突の可能性」なんて話が出てくる理由が無いと思うんだよね
そんなもんは静的に解決されて当然なのだから

ていうかね、参考にしたリンク貼ってくださいよって何回も言ってるでしょう
そのほうがあなたが(もしかすると私が)何を勘違いしているのかという答えにたどり着きやすいですって
いちいちあなたも長文で解説しなくて済むんですよ
2023/03/31(金) 23:03:06.56ID:Q5ExbgOu
>>904
間違いがないのに間違いだと言い張る悪い癖はやめたほうがいいよ
冒頭に「Rustについて」と明記していてC++について一切記述していない
もしRustについて記述した>>886に間違いがあると主張するなら指摘してください

> 参考にしたリンク貼ってくださいよ

参考はRust公式ドキュメントとコードのみ
他の解説サイトがあるかどうか調べたこともないので知らない
906デフォルトの名無しさん
垢版 |
2023/03/31(金) 23:13:20.94ID:oRUGNWak
>>887
間違いがあるとタダで教えてくれるだけでも相当にありがたいことだと認識すべきだぞ
どこがどう間違えてるかをタダで懇切丁寧に教えてもらえると考えるのは甘えでしかない
2023/03/31(金) 23:15:00.18ID:RaXhcLNj
>>905
なるほどね?
例えば「検索する必要がない」「メソッドの衝突の可能性は通常時よりも減ったり無くなったりする」は対比的にそれらが「ある」存在に暗に言及しているのだと思ったよ
行間を読んで根本的に何を勘違いしているのか探ろうと思ったが、これはあくまでRustに関する言及でしかないと
「高速」も何と比較してなのか不明で虚しい響きがあるが、高速だというならそうなんだろう

じゃあ私から言えるのはこれだけです

> Rustは常にメソッドが静的に一意に確定する
じゃあRustに動的ディスパッチなんて実装する必要無いじゃん
dyn存在意義無いじゃん
「『トレイトとメソッド名のペア』が一意に確定する」ならそう書かないと、この文脈でこの表現は語弊しか無いよ
2023/03/31(金) 23:19:08.47ID:EgdFd66u
自分が長文を書きたいのではなく、相手に自分の真似をさせたいんじゃないか
知らんけど
真似してくれれば人間皆どっちもどっちだと実証されるかも知れないから
2023/03/31(金) 23:22:31.74ID:tr7cKY8h
ぽまいら一人一人が要点を絞ってくれ
発散させあってたらきりがないんよ

余計なことは省くこと
余計じゃないものが複数あってもより大事なほうを一つ選んで議論を続行すること
2023/03/31(金) 23:22:49.85ID:hy3TCCAc
>>904
メソッド名が衝突した時にどうなるか?どう対応できるか?は
各言語によって異なるから
その説明があるのは普通じゃないか
alias付ける必要があったりなど十人十色
911デフォルトの名無しさん
垢版 |
2023/03/31(金) 23:28:00.63ID:JG8RdAc0
動的ディスパッチするために必要な間接参照の数はRustもC++も同じで高速とか低速とかないから

Rustは動的ディスパッチを使う場合は必ずポインタ経由になるので構造体のデータを読むのに間接参照が1回必ず入る
これが持ち方の違いによって出る差の一つ
912デフォルトの名無しさん
垢版 |
2023/03/31(金) 23:50:08.60ID:FlP4pMOX
あ、多重継承のケースがあったか
でもまあ気にするようなオーバーヘッドじゃないよね
2023/03/31(金) 23:51:44.88ID:Q5ExbgOu
>>907
後半の指摘については、短い中で詳細まで説明できていないから誤解を与えてしまったもしれないので、そこはすまん
しかしその指摘だとまだ別の誤解されてそうだからその部分についてだけ一応書いておくと
ある型Fooのメソッドmethodの各呼び出しがそれぞれ異なっていてもよくて
Foo::method() なのか
<Foo as Trait1>::method() なのか
<Foo as Trait2>::method() なのかが決まり
Foo::method()がなくてそれ以外が複数で曖昧な時はエラーになるというだけの話
いろんな言語があるからね
2023/03/31(金) 23:57:35.53ID:RaXhcLNj
>>913
具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
そしてこのときトレイトは確定しているのでメソッド名は衝突しません
だからメソッド名の衝突の話が出てくる意味が分からないと言っているんです
2023/03/31(金) 23:57:58.72ID:cX1DOwsp
>>912
多重継承の場合はどうなるの?
そこが焦点な気がしてきた
2023/03/31(金) 23:59:30.92ID:Q5ExbgOu
>>914
ちゃんと>>886を読みなよ
動的ディスパッチの話は最後の段落にしか書いていない
2023/04/01(土) 00:04:38.33ID:AdU+jSWJ
>>914
それはRustの基本が理解できていない
トレイトオブジェクトでも当然メソッド名は衝突しうる
なぜ衝突するのかも>>886に書いてあるな
918デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:04:51.67ID:XaCtro1R
>>900
そのメソッドは迷惑行為なので
間違いを信じそうな人がいる時だけ
レス内容が間違ってることのみを指摘するのが吉
2023/04/01(土) 00:09:36.60ID:+ti2a57c
そのムーブはわかってないけどとりあえずケチつけてんだなとしか思わないよ
指摘できないけど誰か論破してくれねーかなっていう情けない感じ
2023/04/01(土) 00:09:53.12ID:YJwv5+OD
>>914
ボロボロですよ
トレイト境界を勉強しましょうね
2023/04/01(土) 00:12:20.97ID:ktHgE8AY
>>916
>>882が「Rustでは動的ディスパッチを実現するために〜〜」という文脈だったから最初からその範囲の訂正しか書いてないんだと思ったよ
脈絡もなく余計な文章を足すとそれがどういう意図でそこにあるのか理解してもらえないから気をつけようね

>>917
ああ厳密にはそうだね、私が間違っておりました
動的ディスパッチには関係ない文脈で書いた文章だって聞いたんでそこはもうどうでもいいです
922デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:13:02.49ID:+UQ+9Bf4
>>915
全然焦点じゃないから気にすんな
923デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:19:53.47ID:78d0gX0o
>>921
だよねー
>>886>>882の間違いを指摘できてるわけでもなく何の意味もない
2023/04/01(土) 00:21:52.63ID:AdU+jSWJ
>>921
まだ理解できていないのか?
動的ディスパッチの時こそメソッド名の衝突に対しての処置が重要
そのためどのトレイトのメソッドを呼び出すかを静的に確定するとともに
各トレイトの同名メソッドを区別してvtableのインデックス化をしている
925デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:32:15.20ID:DyolynIp
>>924
>各トレイトの同名メソッドを区別してvtableのインデックス化をしている
うそーん
ソースを提示してね
2023/04/01(土) 00:34:01.19ID:ktHgE8AY
>>924
「各トレイトの同名メソッドを区別してvtableのインデックス化をしている」
ここを詳しく説明してくれますか?
必要なら次の例を使ってください(こういう状況のことでいいんですよね?)

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a72f5f361d0e82594bace55483e66c7c
2023/04/01(土) 00:35:46.81ID:YJwv5+OD
>>925
インデックス区別しないと動的ディスパッチできないですよ
2023/04/01(土) 00:50:45.22ID:ktHgE8AY
SubとSuper逆だわ
気になるなら直してていいよ
2023/04/01(土) 00:56:33.36ID:tiKbQym2
>>914
バカだな
動的ディスパッチが行われるときは具体型Fooが確定しているぞ
具体型が確定しているからこそ動的ディスパッチを実行することができる
おまえC++もRustも両方を理解できてねーな
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の説明で合っている
931デフォルトの名無しさん
垢版 |
2023/04/01(土) 03:08:57.82ID:TpFQVX+V
>>930
単にvtableが作られることを「vtableをインデックス化してる」と言ってたのね
もう嫌だ
2023/04/01(土) 03:10:50.58ID:AdU+jSWJ
>>931
助詞を間違えてるぞ
「各トレイトの同名メソッドを区別してvtableのインデックス化」な
933デフォルトの名無しさん
垢版 |
2023/04/01(土) 03:16:00.87ID:TpFQVX+V
>>932
どっちでも間違ってる
インデックス化されるのはメソッド
vtableはメソッドがインデックス化されたデータ構造
2023/04/01(土) 03:30:04.06ID:AdU+jSWJ
>>933
だからそう書いてるだろ
文章も>>930のコードも読めないのか?
935デフォルトの名無しさん
垢版 |
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に集え
2023/04/01(土) 06:30:37.76ID:ol7Kdurc
マ板でやれ無能
>>3を理解しろ
2023/04/01(土) 06:56:17.26ID:073QzAPe
ディスパッチがどうとか言ってるあいだに1000きそうだぞこれ

なんだかんだで実際は両方使うけど、やっぱ俺はこっち推すぜ! みたいなスレになりつつ
テンプレ用意すんの?
940デフォルトの名無しさん
垢版 |
2023/04/01(土) 10:28:30.10ID:h8xyCGJ+
>>934
書いてないじゃん
見苦しい嘘つくなよ
2023/04/01(土) 10:56:30.89ID:3pQ6SLTI
要するに「へぇ、継承ってのがあるのか、どうやって実現するんやろ?あ、オレならこうするな、でもそれだとこうなってコストメチャメチャかかるじゃん、使えねぇな」と思ってるくちじゃないの?
2023/04/01(土) 11:11:44.89ID:IIYgmYPv
その件は>>930が正しい
assert通るのを確認した
2023/04/01(土) 12:25:26.51ID:ktHgE8AY
>>930
言いたいことは理解した

でもね、そもそも「衝突」は定義だけで発生するものなんですよ
そのコードのmainの中でdyn_foo.method()と書くと発生するエラーは、「名前解決の失敗」と呼ばれます

そしてこの「衝突」の有り無しは、「vtableのインデックス化」に特に影響を与えません
現に片方だけメソッド名を変更しても、同じレイアウトになりますよね
内部的には別トレイトのメソッドなのだから、"method"部分が「衝突」するしないに関係なく区別されます
「衝突」に、vtableに関して特筆すべき重要性は無いと思います
944デフォルトの名無しさん
垢版 |
2023/04/01(土) 12:47:01.18ID:km+jzk5n
静的型付けをしてればどのメソッド実装を呼び出すか静的に決まるのは当たり前のこと
それを何か特別なことのように変な長文書くからバカにされる
2023/04/01(土) 13:18:48.32ID:hxeslJ4Q
C++er あるあるシリーズ
#![allow(unused)]
... = hoge().unwrap;
... = hoge()?;
let p: *const [u8] = &fuga;
unsafe {}
946デフォルトの名無しさん
垢版 |
2023/04/01(土) 13:25:38.29ID:hxeslJ4Q
>>900
chatGPT そのもののことだな
2023/04/01(土) 13:33:41.52ID:hxeslJ4Q
>>936
みたけどイマイチ
948デフォルトの名無しさん
垢版 |
2023/04/01(土) 13:35:01.01ID:hxeslJ4Q
>>937
ほんそれ

C++出来る人はC++使えば良い
C++出来ない人やC++でやらかすうっかりさんだけRust使えば良い
2023/04/01(土) 13:38:19.66ID:goAbMbb3
面白いのはC++ちょっとかじったくらいのド素人ほど
なぜかRustに引き寄せられてる気がする
ニワカ人間を引きつける同じニオイがするんだろうなRustには
2023/04/01(土) 13:46:59.44ID:WHqiXdwW
C++は底なし沼な感じが良い
未だにModern C++ Designを初めて読んだときの衝撃を上回る
本には出会ったことがない
2023/04/01(土) 14:05:07.99ID:goAbMbb3
職業マとアマチュアで感想違うよね
職業マ「C++? 糞の糞糞」
アマチュア「C++? vtableのコスト(キャッキャ)
鼻から悪魔(ウフフフ)膝を撃ち抜く(キャッキャ)CRTP(ウフフ)
2023/04/01(土) 14:25:21.95ID:hxeslJ4Q
Javaは糞
C#はチョット良い感じ
Juliaは死んだ
Rustがんがれ
Nimもがんがれ
C++は使い続けるけどね
2023/04/01(土) 15:11:33.70ID:rIj/v2ga
>>937
C++に挫折した者ども、いまこそRustに集え
そしてRustに挫折した者ども、いま一度C++に立ち返れ

の方がバランスいいと思う
2023/04/01(土) 16:41:11.09ID:HWGbnwVz
>>944
同名メソッドが衝突した時にどうなるかは言語によってかなり異なるから一番重要じゃないかな
衝突が許されない言語と許される場合も条件がある場合もあるよ
衝突があってもエラー出ない言語もあれば特定な時だけエラーな言語もあるね
回避方法も別名定義方式から同名自己定義や直接指定と色々だ
2023/04/01(土) 17:25:01.59ID:/8VZFYJJ
Rustが「認め」られたことで、C++のスマポも、べき・べからずが確定したと考えておk?
2023/04/01(土) 17:29:58.10ID:WHqiXdwW
>>955
どういう意味?
2023/04/01(土) 17:52:08.96ID:/8VZFYJJ
大手が認めたんだから、Rustと同等に書ければ、それはsafeなんだよな?
これまで、C++のスマポは、CppCoreGuidelinesなんてものはあっても、強制されなかった
2023/04/01(土) 18:00:21.17ID:WHqiXdwW
Rustに関係なくC++ではスマートポインタを使用すれば安全に書けるし
スマートポインタの使用するしないにRustは全く関係ない?
ここ見てる人は俺も含めてRustに注目してはいるが
C++ユーザのほとんどはRustなど眼中にないだろう
2023/04/01(土) 18:01:23.45ID:WHqiXdwW
二行目最後?を消し忘れた
2023/04/01(土) 18:06:42.88ID:/8VZFYJJ
強制されるってのがミソだろ Rust派は、Rustなら、必ず・全部安全って言ってるんだからさ
961デフォルトの名無しさん
垢版 |
2023/04/01(土) 18:09:42.77ID:vBVsKFoD
>>933
某オジお得意の誤訳だったんじゃねーの?
2023/04/01(土) 19:15:27.20ID:ugeMTEEj
>>914
> 具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません


動的ディスパッチが実行される時点では必ず具体型Fooが確定している

> dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
> そしてこのときトレイトは確定しているのでメソッド名は衝突しません

衝突する
直接のトレイトは確定しても付随するトレイト境界があれば各トレイトでメソッド名は衝突しうる
2023/04/01(土) 19:16:31.21ID:ma7yA/CE
>>954
でも>>905によるとRust以外の話をしたつもりは無いらしいよ?
深読みしすぎじゃないかな?
2023/04/01(土) 19:31:10.27ID:9m4PZsrB
どの言語でも他の言語とは異なる特徴があるからその説明をしてくれないとわからん
それを説明されると困る人がいるのが不思議
2023/04/01(土) 21:31:47.02ID:WHqiXdwW
>>957,960
何を言っているのかサッパリ分からん
2023/04/01(土) 21:44:43.97ID:NRw2BG4n
そいつはRustのこともC++のことも何も知らないくせに
なにかコメントしたいだけの池沼なので放置するしかない
2023/04/01(土) 21:50:56.74ID:WHqiXdwW
ひょっとしてGC君かな?
2023/04/01(土) 21:55:20.36ID:3M3YuI+X
>>958
C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
さらに複雑化した時のスマポの使い方ミスで多くの問題が起きてきたことを考えると
本当に必要なのはスマポが正しく使われていない時にコンパイルエラーを出すこと
現状のC++は欠陥品であり今後も多くのセキュリティホールを生み出し続けるだろう
969デフォルトの名無しさん
垢版 |
2023/04/01(土) 21:57:58.76ID:WHqiXdwW
>>968
おおGCくんが来た

>C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
どんなミスか興味があるのでソースで示してね
2023/04/01(土) 22:10:09.20ID:rBOo7R6g
>>743
同感
Rustは衛生的マクロな点を始めとして各種マクロが優秀すぎる
C++がダメすぎるんだよな
テンプレートも問題ありすぎ
971デフォルトの名無しさん
垢版 |
2023/04/01(土) 22:21:05.85ID:nbXeTJU5
ディスパッチの定義を捻じ曲げたのと同じで
衝突の定義も捻じ曲げにきてるよな
2023/04/01(土) 23:32:16.53ID:AdU+jSWJ
>>940
コードがわかりくいのかなと思って
vtableのところをもう少しわかりやすくしてみた

trait TraitA { fn method1(&self); fn method2(&self); }
trait TraitB { fn method1(&self); fn method2(&self); }
trait TraitAB: TraitA + TraitB {}

struct Foo;
impl TraitA for Foo { fn method1(&self) {} fn method2(&self) {} }
impl TraitB for Foo { fn method1(&self) {} fn method2(&self) {} }
impl TraitAB for Foo {}

macro_rules! as_addr { ($target:expr) => { &($target) as *const _ } }
macro_rules! as_array { ($addr:expr, $index:expr) => { *(($addr) as *const usize).offset($index) } }
macro_rules! vtable { ($dyn:expr, $index:expr) => { unsafe { as_array![as_array![as_addr!($dyn), 1], $index] } } }

fn main() {
let foo = Foo;
let dyn_foo: &dyn TraitAB = &foo;
assert_eq!(vtable![dyn_foo, 0], std::ptr::drop_in_place::<Foo> as usize);
assert_eq!(vtable![dyn_foo, 1], std::mem::size_of::<Foo>());
assert_eq!(vtable![dyn_foo, 2], std::mem::align_of::<Foo>());
assert_eq!(vtable![dyn_foo, 3], <Foo as TraitA>::method1 as usize);
assert_eq!(vtable![dyn_foo, 4], <Foo as TraitA>::method2 as usize);
assert_eq!(vtable![dyn_foo, 5], <Foo as TraitB>::method1 as usize);
assert_eq!(vtable![dyn_foo, 6], <Foo as TraitB>::method2 as usize);
}

このように各トレイトの同名メソッドを区別してvtableのインデックス化(このコードだと他の部分含めてインデックス3~6)をしている
2023/04/01(土) 23:39:50.11ID:62NQQrT2
これ次スレたてるの? あるいはどっかの雑スレに合流?
974デフォルトの名無しさん
垢版 |
2023/04/01(土) 23:53:21.20ID:3egme1as
C/C++ vs Rustとしてあった方が良いと思うけどね
雑スレだとGCの勢力が強くなりそう
2023/04/02(日) 00:22:03.90ID:Xkdfgrgv
5chでC++↓Rust↑している人のC++理解度の低さは強調してしすぎることはない

https://mevius.5ch.net/test/read.cgi/tech/1652347700/385-392
976デフォルトの名無しさん
垢版 |
2023/04/02(日) 00:30:37.47ID:bY6+UifX
>>972
汚コードに磨きをかけるなよ
普通に関数で書けるものをネストさせたマクロにするセンスに脱帽
2023/04/02(日) 00:32:38.03ID:xbcpqSco
単純に開発効率の問題だよな
C++よりRustは実行デバッグの時間がかなり減って開発効率がいい
2023/04/02(日) 00:39:46.89ID:GYBlNyWI
汚コード唱えるやつがコードを示したことがなく信用できない
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況