結局C++とRustってどっちが良いの?
レス数が950を超えています。1000を超えると書き込みができなくなります。
C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな? 1. 知ったかぶりして嘘をさも本当かのように書き連ねる
2. 間違いを指摘されるとググって必死に正解を探す
3. そしてそんなことは最初から知ってましたというトーンで長文まとめスレを他人のフリして書く
これが複オジメソッド >>900
そして話の内容がC++になると複おじにはちんぷんかんぷんなので
調べても間に合わないし、無限に別の間違いを生み出し続けてしまうというw >>899
俺が間違ってるって??
>>886に間違ってるところがあるなら指摘してくれ >>900
4. 他人のふりして書いた長文まとめも間違っている
というオチ付き >>902
その「間違ってる本人」は>>882のことを指していて、間違いがあるのは>>886のことではないと思うが
それはそれとして>>886の間違いを指摘しておくと
あなたC++で「どのvtableを見るべきか」を実行時にしか判断できないケースがあると思ってない? 嘘だよそれ
じゃないと「メソッドの衝突の可能性」なんて話が出てくる理由が無いと思うんだよね
そんなもんは静的に解決されて当然なのだから
ていうかね、参考にしたリンク貼ってくださいよって何回も言ってるでしょう
そのほうがあなたが(もしかすると私が)何を勘違いしているのかという答えにたどり着きやすいですって
いちいちあなたも長文で解説しなくて済むんですよ >>904
間違いがないのに間違いだと言い張る悪い癖はやめたほうがいいよ
冒頭に「Rustについて」と明記していてC++について一切記述していない
もしRustについて記述した>>886に間違いがあると主張するなら指摘してください
> 参考にしたリンク貼ってくださいよ
参考はRust公式ドキュメントとコードのみ
他の解説サイトがあるかどうか調べたこともないので知らない >>887
間違いがあるとタダで教えてくれるだけでも相当にありがたいことだと認識すべきだぞ
どこがどう間違えてるかをタダで懇切丁寧に教えてもらえると考えるのは甘えでしかない >>905
なるほどね?
例えば「検索する必要がない」「メソッドの衝突の可能性は通常時よりも減ったり無くなったりする」は対比的にそれらが「ある」存在に暗に言及しているのだと思ったよ
行間を読んで根本的に何を勘違いしているのか探ろうと思ったが、これはあくまでRustに関する言及でしかないと
「高速」も何と比較してなのか不明で虚しい響きがあるが、高速だというならそうなんだろう
じゃあ私から言えるのはこれだけです
> Rustは常にメソッドが静的に一意に確定する
じゃあRustに動的ディスパッチなんて実装する必要無いじゃん
dyn存在意義無いじゃん
「『トレイトとメソッド名のペア』が一意に確定する」ならそう書かないと、この文脈でこの表現は語弊しか無いよ 自分が長文を書きたいのではなく、相手に自分の真似をさせたいんじゃないか
知らんけど
真似してくれれば人間皆どっちもどっちだと実証されるかも知れないから ぽまいら一人一人が要点を絞ってくれ
発散させあってたらきりがないんよ
余計なことは省くこと
余計じゃないものが複数あってもより大事なほうを一つ選んで議論を続行すること >>904
メソッド名が衝突した時にどうなるか?どう対応できるか?は
各言語によって異なるから
その説明があるのは普通じゃないか
alias付ける必要があったりなど十人十色 動的ディスパッチするために必要な間接参照の数はRustもC++も同じで高速とか低速とかないから
Rustは動的ディスパッチを使う場合は必ずポインタ経由になるので構造体のデータを読むのに間接参照が1回必ず入る
これが持ち方の違いによって出る差の一つ あ、多重継承のケースがあったか
でもまあ気にするようなオーバーヘッドじゃないよね >>907
後半の指摘については、短い中で詳細まで説明できていないから誤解を与えてしまったもしれないので、そこはすまん
しかしその指摘だとまだ別の誤解されてそうだからその部分についてだけ一応書いておくと
ある型Fooのメソッドmethodの各呼び出しがそれぞれ異なっていてもよくて
Foo::method() なのか
<Foo as Trait1>::method() なのか
<Foo as Trait2>::method() なのかが決まり
Foo::method()がなくてそれ以外が複数で曖昧な時はエラーになるというだけの話
いろんな言語があるからね >>913
具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
そしてこのときトレイトは確定しているのでメソッド名は衝突しません
だからメソッド名の衝突の話が出てくる意味が分からないと言っているんです >>912
多重継承の場合はどうなるの?
そこが焦点な気がしてきた >>914
ちゃんと>>886を読みなよ
動的ディスパッチの話は最後の段落にしか書いていない >>914
それはRustの基本が理解できていない
トレイトオブジェクトでも当然メソッド名は衝突しうる
なぜ衝突するのかも>>886に書いてあるな >>900
そのメソッドは迷惑行為なので
間違いを信じそうな人がいる時だけ
レス内容が間違ってることのみを指摘するのが吉 そのムーブはわかってないけどとりあえずケチつけてんだなとしか思わないよ
指摘できないけど誰か論破してくれねーかなっていう情けない感じ >>914
ボロボロですよ
トレイト境界を勉強しましょうね >>916
>>882が「Rustでは動的ディスパッチを実現するために〜〜」という文脈だったから最初からその範囲の訂正しか書いてないんだと思ったよ
脈絡もなく余計な文章を足すとそれがどういう意図でそこにあるのか理解してもらえないから気をつけようね
>>917
ああ厳密にはそうだね、私が間違っておりました
動的ディスパッチには関係ない文脈で書いた文章だって聞いたんでそこはもうどうでもいいです >>921
だよねー
>>886は>>882の間違いを指摘できてるわけでもなく何の意味もない >>921
まだ理解できていないのか?
動的ディスパッチの時こそメソッド名の衝突に対しての処置が重要
そのためどのトレイトのメソッドを呼び出すかを静的に確定するとともに
各トレイトの同名メソッドを区別してvtableのインデックス化をしている >>924
>各トレイトの同名メソッドを区別してvtableのインデックス化をしている
うそーん
ソースを提示してね >>925
インデックス区別しないと動的ディスパッチできないですよ SubとSuper逆だわ
気になるなら直してていいよ >>914
バカだな
動的ディスパッチが行われるときは具体型Fooが確定しているぞ
具体型が確定しているからこそ動的ディスパッチを実行することができる
おまえC++もRustも両方を理解できてねーな >>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の説明で合っている >>930
単にvtableが作られることを「vtableをインデックス化してる」と言ってたのね
もう嫌だ >>931
助詞を間違えてるぞ
「各トレイトの同名メソッドを区別してvtableのインデックス化」な >>932
どっちでも間違ってる
インデックス化されるのはメソッド
vtableはメソッドがインデックス化されたデータ構造 >>933
だからそう書いてるだろ
文章も>>930のコードも読めないのか? C++からメタ言語機能のような黒魔術を無くして使いやすくしたのがRustという認識でよろしいか? ディスパッチがどうとか言ってるあいだに1000きそうだぞこれ
なんだかんだで実際は両方使うけど、やっぱ俺はこっち推すぜ! みたいなスレになりつつ
テンプレ用意すんの? 要するに「へぇ、継承ってのがあるのか、どうやって実現するんやろ?あ、オレならこうするな、でもそれだとこうなってコストメチャメチャかかるじゃん、使えねぇな」と思ってるくちじゃないの? その件は>>930が正しい
assert通るのを確認した >>930
言いたいことは理解した
でもね、そもそも「衝突」は定義だけで発生するものなんですよ
そのコードのmainの中でdyn_foo.method()と書くと発生するエラーは、「名前解決の失敗」と呼ばれます
そしてこの「衝突」の有り無しは、「vtableのインデックス化」に特に影響を与えません
現に片方だけメソッド名を変更しても、同じレイアウトになりますよね
内部的には別トレイトのメソッドなのだから、"method"部分が「衝突」するしないに関係なく区別されます
「衝突」に、vtableに関して特筆すべき重要性は無いと思います 静的型付けをしてればどのメソッド実装を呼び出すか静的に決まるのは当たり前のこと
それを何か特別なことのように変な長文書くからバカにされる C++er あるあるシリーズ
#![allow(unused)]
... = hoge().unwrap;
... = hoge()?;
let p: *const [u8] = &fuga;
unsafe {} >>937
ほんそれ
C++出来る人はC++使えば良い
C++出来ない人やC++でやらかすうっかりさんだけRust使えば良い 面白いのはC++ちょっとかじったくらいのド素人ほど
なぜかRustに引き寄せられてる気がする
ニワカ人間を引きつける同じニオイがするんだろうなRustには C++は底なし沼な感じが良い
未だにModern C++ Designを初めて読んだときの衝撃を上回る
本には出会ったことがない 職業マとアマチュアで感想違うよね
職業マ「C++? 糞の糞糞」
アマチュア「C++? vtableのコスト(キャッキャ)
鼻から悪魔(ウフフフ)膝を撃ち抜く(キャッキャ)CRTP(ウフフ) Javaは糞
C#はチョット良い感じ
Juliaは死んだ
Rustがんがれ
Nimもがんがれ
C++は使い続けるけどね >>937
C++に挫折した者ども、いまこそRustに集え
そしてRustに挫折した者ども、いま一度C++に立ち返れ
の方がバランスいいと思う >>944
同名メソッドが衝突した時にどうなるかは言語によってかなり異なるから一番重要じゃないかな
衝突が許されない言語と許される場合も条件がある場合もあるよ
衝突があってもエラー出ない言語もあれば特定な時だけエラーな言語もあるね
回避方法も別名定義方式から同名自己定義や直接指定と色々だ Rustが「認め」られたことで、C++のスマポも、べき・べからずが確定したと考えておk? 大手が認めたんだから、Rustと同等に書ければ、それはsafeなんだよな?
これまで、C++のスマポは、CppCoreGuidelinesなんてものはあっても、強制されなかった Rustに関係なくC++ではスマートポインタを使用すれば安全に書けるし
スマートポインタの使用するしないにRustは全く関係ない?
ここ見てる人は俺も含めてRustに注目してはいるが
C++ユーザのほとんどはRustなど眼中にないだろう 強制されるってのがミソだろ Rust派は、Rustなら、必ず・全部安全って言ってるんだからさ >>933
某オジお得意の誤訳だったんじゃねーの? >>914
> 具体型Fooが確定している状態で動的ディスパッチは絶対に発生しません
逆
動的ディスパッチが実行される時点では必ず具体型Fooが確定している
> dynと目印のついたトレイトオブジェクト経由でしか動的ディスパッチは発生しません
> そしてこのときトレイトは確定しているのでメソッド名は衝突しません
衝突する
直接のトレイトは確定しても付随するトレイト境界があれば各トレイトでメソッド名は衝突しうる >>954
でも>>905によるとRust以外の話をしたつもりは無いらしいよ?
深読みしすぎじゃないかな? どの言語でも他の言語とは異なる特徴があるからその説明をしてくれないとわからん
それを説明されると困る人がいるのが不思議 >>957,960
何を言っているのかサッパリ分からん そいつはRustのこともC++のことも何も知らないくせに
なにかコメントしたいだけの池沼なので放置するしかない >>958
C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
さらに複雑化した時のスマポの使い方ミスで多くの問題が起きてきたことを考えると
本当に必要なのはスマポが正しく使われていない時にコンパイルエラーを出すこと
現状のC++は欠陥品であり今後も多くのセキュリティホールを生み出し続けるだろう >>968
おおGCくんが来た
>C++でスマポを使ってもヌル安全性もデータ競合安全性も得られない
どんなミスか興味があるのでソースで示してね >>743
同感
Rustは衛生的マクロな点を始めとして各種マクロが優秀すぎる
C++がダメすぎるんだよな
テンプレートも問題ありすぎ ディスパッチの定義を捻じ曲げたのと同じで
衝突の定義も捻じ曲げにきてるよな >>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)をしている これ次スレたてるの? あるいはどっかの雑スレに合流? C/C++ vs Rustとしてあった方が良いと思うけどね
雑スレだとGCの勢力が強くなりそう >>972
汚コードに磨きをかけるなよ
普通に関数で書けるものをネストさせたマクロにするセンスに脱帽 単純に開発効率の問題だよな
C++よりRustは実行デバッグの時間がかなり減って開発効率がいい 汚コード唱えるやつがコードを示したことがなく信用できない >>978
君の日本語がおかしいって話なんで、ソースで示すべきことは何も無いよ
それともなにか示してほしいの? スレを読んでいて技術的な論争は興味深いんだけど
他人への攻撃をしてる人たちは邪魔なんで消えてほしい そもそも>>1がソースを書けないと思われる
特にC++は読めもしないのだろう
RustとC++を技術的に比較するなら両方のソースをある程度書けないと不可能 >>3 にあるとおり、やれっていわれたらやる マとしてはこれでFA
慣れは必要だけど、要求される頃には、定石も今以上に揃うだろうし
ここ読んでて、食わず嫌いしてたRustを眺めなおしてから、
CppCoreGuidelines 読んだら、めっちゃわかりやすかった
これだけで俺には十分収穫あったね Linusに認められた、これだけで、Rustの「勝利」は外形的事実 争う必要はない
はずなのに、そのうえまだ、Rustの優位を主張するのに全力な香具師がいる
若いなって正直思う 昔俺もああだったぜ
C++を母語としている者が考えることは、次に何を取り込むか
やっぱ #pragma safe は欲しいね
そのうしろに値くらい付いてもいい safeの詳細も、進化していくだろうから あああと、パタンマッチを知らなかったのも俺だ (知らぬは)一生の恥になるとこだったw
静的にソースコードを解析してsafeを証明できる、ガイドライン違反を指摘できることだとばかり
rustcのサンプル出してくれた奴には悪かった
「たしかに面白い…けど、こういうの、Cなら、yylvalっぽく処理するよね…」っていう印象だったんだ
inspectってのが来たら来るらしいので、来たら喜んで遊んでみるとして
優位性の根拠になるか? それホントC++に必要? ってのは次スレに持ち越したい
っていう埋め >>985
キミは周回遅れのド素人でかつ
人より知能が劣るからもう発言しなくていいです
これはいじわる発言じゃなくて、助言です よく言われるよ
Rustのエヴァンジェリストが暴れていいのに、初心者の俺に黙っとけはないなあ
せいぜい質問させてもらうよ >>981と>>986は同一人物です
皆さん次スレでも騙されないようご注意を >>976
複オジメソッドに釣られてるよ
気をつけて 自分の間違いを認められるだけマシ
>>981は露骨に複おじだけど
>>986=>>847=ID:BpzIAh0Kは違う気がするんよなあ
あんまり雑認定しすぎるとおじサイドの「自演に見えてるやつは頭がおかしい」の批判が有効になってしまうから、確証を持てないならほどほどにな 俺は池沼と複オジをこのスレから排除したいだけよ
だって時間のムダだもん やめろバカ!複おじを野に放つ気か!?
せっかく平和なRust本スレが実現できて、後はヤツが追い払った住民たちを呼び戻すだけだというのに! 残念だが、初心者お断りとは書いてなかったんだなあ
そうくると思って、俺がとっととスレ建てちまったからねw >>993
そうかそっちか
それは申し訳なかった
こっちを隔離にすべきやね
複オジも池沼(ID:W9/nq+tL)もこっちに張り付く気マンマンらしいし まあまあ同じスレで出会った仲間なんだから仲良くしようや Rustが良いって言ってる人は
C/C++のポインタとメモリ管理理解出来なかったからだろ レス数が950を超えています。1000を超えると書き込みができなくなります。