探検
結局C++とRustってどっちが良いの?
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2023/02/25(土) 09:49:46.74ID:VRyB88xR C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
607デフォルトの名無しさん
2023/03/27(月) 17:02:39.76ID:V0RoakbK 酷いのはお前の頭と顔だよ
608デフォルトの名無しさん
2023/03/27(月) 17:10:12.43ID:f4PBXzjX >>606
記事はバカだけどコメントはまあいいんじゃね?
それよりも、Rustを置き換えられる言語が出現しないと、Rustの天下が続きそ。
C並みに高速で何でも書けてGCもなく、にも関わらず様々な安全性が静的に保証される言語が、Rust以外に芽も出てこなさげ。
記事はバカだけどコメントはまあいいんじゃね?
それよりも、Rustを置き換えられる言語が出現しないと、Rustの天下が続きそ。
C並みに高速で何でも書けてGCもなく、にも関わらず様々な安全性が静的に保証される言語が、Rust以外に芽も出てこなさげ。
609デフォルトの名無しさん
2023/03/27(月) 17:19:21.38ID:8vpfa9xS >>605
MSだから
MSだから
610デフォルトの名無しさん
2023/03/27(月) 17:23:03.66ID:ztwrSg39 何が続きそ。だよ
自演バレないように新文体開拓しようとしてんのマジでキモいわ
自演バレないように新文体開拓しようとしてんのマジでキモいわ
611デフォルトの名無しさん
2023/03/27(月) 17:26:14.23ID:8vpfa9xS コメントしたった
TypeScriptはC#やDelphiを作ったアンダースヘルスバーグが設計してるからです
以上
TypeScriptはC#やDelphiを作ったアンダースヘルスバーグが設計してるからです
以上
612デフォルトの名無しさん
2023/03/27(月) 17:26:50.78ID:8vpfa9xS Rustまだ全然天下じゃないんだが…
周り見えてない人なのかな?
周り見えてない人なのかな?
613デフォルトの名無しさん
2023/03/27(月) 17:27:28.03ID:8vpfa9xS 言うほどガベコレ悪いか?って話になるんだが君たち何を作ってんだ?
614デフォルトの名無しさん
2023/03/27(月) 17:28:15.22ID:8vpfa9xS 言うほど1フレーム1フレームの処理落ちが問題になることしてんの?
ゲームくらいじゃね?
ゲームくらいじゃね?
615デフォルトの名無しさん
2023/03/27(月) 17:28:57.15ID:8vpfa9xS その点ゲームでRustは使われない
マジで何してんの?って話よな
マジで何してんの?って話よな
616デフォルトの名無しさん
2023/03/27(月) 17:35:59.10ID:tLmo//P+617デフォルトの名無しさん
2023/03/27(月) 17:37:53.83ID:8vpfa9xS >>616
ほんでその車載ソフトはRustで書かれんのか?
ほんでその車載ソフトはRustで書かれんのか?
618デフォルトの名無しさん
2023/03/27(月) 17:39:01.06ID:tLmo//P+ >>617
いや、まだ言語的に対応してないからC/C++だね、、
いや、まだ言語的に対応してないからC/C++だね、、
619デフォルトの名無しさん
2023/03/27(月) 17:40:35.92ID:8vpfa9xS620デフォルトの名無しさん
2023/03/27(月) 17:52:34.31ID:tLmo//P+ >>619
そうやね
ぶっちゃけ危なそうなものはコーディングルールで縛られるし、過去トラブルや不具合対策も沢山あるから困らないんだよね。
品質保証のためにアセンブラも見るけど、C/C++はアセンブラと比べながら見やすいし
そうやね
ぶっちゃけ危なそうなものはコーディングルールで縛られるし、過去トラブルや不具合対策も沢山あるから困らないんだよね。
品質保証のためにアセンブラも見るけど、C/C++はアセンブラと比べながら見やすいし
621デフォルトの名無しさん
2023/03/27(月) 18:00:15.28ID:BAd7DBJ1 >>616
そこでリアルタイムGCですよ
そこでリアルタイムGCですよ
622デフォルトの名無しさん
2023/03/27(月) 18:06:46.35ID:f2pr1T08 噂によると節電のためにRustを使うらしいな
電気代よりも例えば家賃の方がよっぽど高い人生だったら一生使わないのでは
電気代よりも例えば家賃の方がよっぽど高い人生だったら一生使わないのでは
623デフォルトの名無しさん
2023/03/27(月) 18:13:00.08ID:arDcYvab このままC++は消えていくだろう
アドバンテージが何も残っていない
アドバンテージが何も残っていない
624デフォルトの名無しさん
2023/03/27(月) 18:17:46.08ID:9iT9giTF 上の方で
「Rustのライブラリはあらかた揃って退屈なメンテ作業しか残ってない状態、そんなつまらない作業誰もしないから誰もメンテしなくなってだんだん人が離れていく一歩手前」みたいなQiiitaの記事あったけど、そんなライブラリ充実し始めてる?
「Rustのライブラリはあらかた揃って退屈なメンテ作業しか残ってない状態、そんなつまらない作業誰もしないから誰もメンテしなくなってだんだん人が離れていく一歩手前」みたいなQiiitaの記事あったけど、そんなライブラリ充実し始めてる?
625デフォルトの名無しさん
2023/03/27(月) 18:18:17.10ID:8vpfa9xS >>624
いやしてないよ
いやしてないよ
626デフォルトの名無しさん
2023/03/27(月) 18:27:56.70ID:IKh8n5QH 新規プロジェクトは大方Rustになったが
既存プロジェクトは大規模な更新でしか切り替わらないだろな
既存プロジェクトは大規模な更新でしか切り替わらないだろな
627デフォルトの名無しさん
2023/03/27(月) 18:43:27.53ID:9iT9giTF どっちかって言うと今Pythonとかでちゃんと動いてる、例えばAI用のテンソル計算処理、統計処理のライブラリをRuby用のために用意し直すのっていわゆる「車輪の再発明」みたいになってしまうからわざわざRustに移植するのってどうなん的な感じで充実してこないんじゃないかという気はする
ライブラリが充実してきてみんなが使い出すかどうかって技術的な問題だけじゃなくてその言語が出てきたタイミングとか社会情勢とか背景とかそういう要素もかなり濃密に効いてて、その意味でPythonはすげぇタイミングよかったという気はする
ライブラリが充実してきてみんなが使い出すかどうかって技術的な問題だけじゃなくてその言語が出てきたタイミングとか社会情勢とか背景とかそういう要素もかなり濃密に効いてて、その意味でPythonはすげぇタイミングよかったという気はする
628デフォルトの名無しさん
2023/03/27(月) 19:22:16.60ID:dqg9sWUs Rustで仕事してないやつらばかりだの
儲かるから流行るんだぞ
儲かるから流行るんだぞ
629デフォルトの名無しさん
2023/03/27(月) 19:23:51.08ID:IKh8n5QH 既存のものを移植するのは無駄な行為
既存のものはそのまま使えば良くそのまま使われている
新たなものはRustになっている
それだけの話
既存のものはそのまま使えば良くそのまま使われている
新たなものはRustになっている
それだけの話
630デフォルトの名無しさん
2023/03/27(月) 19:25:47.39ID:ZBCIgMCl Rustの仕事あるかい?
631デフォルトの名無しさん
2023/03/27(月) 19:33:28.90ID:byKu+Dgz >>627
rustもキラープロダクトが出れば一気に普及する
rustもキラープロダクトが出れば一気に普及する
632デフォルトの名無しさん
2023/03/27(月) 19:43:52.09ID:f4PBXzjX >>622
節電というか、こちらはクラウド利用だけど間接的には当たりじゃね?
GC言語からRustへだけど、CPUコストとメモリコストが激減、だからクラウド側では節電となり、Rustはエコ。
GCなく自動メモリ解放する言語Rustの出現が今までの流れを変えた。
節電というか、こちらはクラウド利用だけど間接的には当たりじゃね?
GC言語からRustへだけど、CPUコストとメモリコストが激減、だからクラウド側では節電となり、Rustはエコ。
GCなく自動メモリ解放する言語Rustの出現が今までの流れを変えた。
633デフォルトの名無しさん
2023/03/27(月) 20:10:16.56ID:eSmIEcJi Rustへの動きは2系統あるよな
C/C++からRustへの安全性を高める動き
GC言語からRustへの高速化&省メモリ化の動き
まれに片方の動きの意識しかない人が想像力の欠如した書き込みをしている
C/C++からRustへの安全性を高める動き
GC言語からRustへの高速化&省メモリ化の動き
まれに片方の動きの意識しかない人が想像力の欠如した書き込みをしている
634デフォルトの名無しさん
2023/03/27(月) 20:59:51.90ID:f2pr1T08 目的は1つだけ・手段はいくらでもあるという世界観はしつこく宣伝されてきた
逆に1つの道具で色々できるという話はあまり聞かない
逆に1つの道具で色々できるという話はあまり聞かない
635デフォルトの名無しさん
2023/03/27(月) 21:16:18.71ID:ztwrSg39 Rust製のTurbopackでjsのバンドルが数百倍高速になってもじゃあ俺もRust使おうとはならんのよ
AWSのバックエンドでRust使ってエネルギー効率が向上してもじゃあ俺もRust使おうとはならんのよ
理性的に考えろ
AWSのバックエンドでRust使ってエネルギー効率が向上してもじゃあ俺もRust使おうとはならんのよ
理性的に考えろ
636デフォルトの名無しさん
2023/03/27(月) 21:18:03.30ID:CXyrf6Yu オジの自演は特徴出すぎで草
こちらはクラウド利用www
こちらはクラウド利用www
637デフォルトの名無しさん
2023/03/27(月) 21:25:42.06ID:B8NoQCc/ Windows3.1からMacOSにも流れなかったし
Cのニッチェを奪わなければRustはこの先生
きのこれない
Cのニッチェを奪わなければRustはこの先生
きのこれない
638デフォルトの名無しさん
2023/03/27(月) 21:59:50.76ID:dqg9sWUs アンチは願望ばっかだな
エンジニアの上澄が認めたのだから争っても無駄
エンジニアの上澄が認めたのだから争っても無駄
639デフォルトの名無しさん
2023/03/27(月) 22:10:09.18ID:B8NoQCc/640デフォルトの名無しさん
2023/03/27(月) 23:10:41.22ID:6TNfXJr3641デフォルトの名無しさん
2023/03/27(月) 23:13:47.59ID:xSQDJ/La js、ptyhon、やってきて
rustは新鮮で学べてるけど
c++はやばくね、、、
依存やらのコンパイルの時点で挫折しそうなんだが
ドキュメントもわけわからんし
rustは新鮮で学べてるけど
c++はやばくね、、、
依存やらのコンパイルの時点で挫折しそうなんだが
ドキュメントもわけわからんし
642デフォルトの名無しさん
2023/03/27(月) 23:20:50.21ID:B8NoQCc/643デフォルトの名無しさん
2023/03/27(月) 23:43:11.84ID:Y8evRbQy 余裕だろ
ただ他言語もこぞってと言ってもGC言語は対象外なのでメジャーな言語で可能性があるのはC++のみ
ただ他言語もこぞってと言ってもGC言語は対象外なのでメジャーな言語で可能性があるのはC++のみ
644デフォルトの名無しさん
2023/03/27(月) 23:51:52.30ID:B8NoQCc/ >>643
デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
余裕な訳ないじゃん
copy by valueな言語では後方互換性が犠牲になるので導入無理だよ
デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
余裕な訳ないじゃん
copy by valueな言語では後方互換性が犠牲になるので導入無理だよ
645デフォルトの名無しさん
2023/03/28(火) 00:23:27.41ID:Q1TWiepd >>644
いろんなやり方があるけど実装ができないようなものはない
やろうとすればどのやり方にするのがいいか
細かい仕様をどうするのがいいか
そういう意思決定に時間がかかるだけ
所有権システムをあとから取り込めないなんて発想をする人がRustを宣伝してるのがむしろ驚き
いろんなやり方があるけど実装ができないようなものはない
やろうとすればどのやり方にするのがいいか
細かい仕様をどうするのがいいか
そういう意思決定に時間がかかるだけ
所有権システムをあとから取り込めないなんて発想をする人がRustを宣伝してるのがむしろ驚き
646デフォルトの名無しさん
2023/03/28(火) 00:42:21.55ID:ecLsJgbH >>645
文章読めないのかな?
今まででのコードでインスタンスがコピーされるところを
勝手にmoveにすり替えられたら大惨事だろw
今まで書いたコードを全部書き換えることになる
つまり後方互換性が犠牲になる
C++の開発当初からの方針で最大の特徴はCを内包していること
CもC++もcopy-by-valueな言語
文章読めないのかな?
今まででのコードでインスタンスがコピーされるところを
勝手にmoveにすり替えられたら大惨事だろw
今まで書いたコードを全部書き換えることになる
つまり後方互換性が犠牲になる
C++の開発当初からの方針で最大の特徴はCを内包していること
CもC++もcopy-by-valueな言語
647デフォルトの名無しさん
2023/03/28(火) 00:54:04.89ID:9+wNikJy 視野の狭い人だな
648デフォルトの名無しさん
2023/03/28(火) 01:08:09.67ID:ecLsJgbH >>647
問題についてどう解決するかを書きな?
問題についてどう解決するかを書きな?
649デフォルトの名無しさん
2023/03/28(火) 01:35:54.97ID:m2o7Qw0d 既にCとC++に互換性はない
しかし許された
また同じことをやってまた許されることは可能かもな
しかし許された
また同じことをやってまた許されることは可能かもな
650デフォルトの名無しさん
2023/03/28(火) 01:46:32.83ID:ImlVuHSq まあ拡張子変えれば許されるよcpoとか
あとはsafeブロックとか?
あとはsafeブロックとか?
651デフォルトの名無しさん
2023/03/28(火) 02:00:41.86ID:ecLsJgbH >>649
ほぼ互換性あるだろ? どういったケースのこと書いてるの?
ほぼ互換性あるだろ? どういったケースのこと書いてるの?
652デフォルトの名無しさん
2023/03/28(火) 02:21:00.53ID:gbUXYbOA >>626
新規プロジェクトって例えばどれよ?
新規プロジェクトって例えばどれよ?
653デフォルトの名無しさん
2023/03/28(火) 02:21:41.39ID:gbUXYbOA >>628
なんの仕事してんの?
なんの仕事してんの?
654デフォルトの名無しさん
2023/03/28(火) 02:22:00.97ID:WlqhC76+655デフォルトの名無しさん
2023/03/28(火) 02:24:01.41ID:gbUXYbOA656デフォルトの名無しさん
2023/03/28(火) 02:25:39.63ID:6yQ3WRoT657デフォルトの名無しさん
2023/03/28(火) 02:31:45.17ID:6yQ3WRoT >>644
現状のスマポとmoveを用いたC++の所有権システムはRustのシンプルな記述と比べると面倒で忘れたりミスしたりしてしまうがあれが限界っぽい
後方互換性を保ったままC++を快適にするのは不可能
現状のスマポとmoveを用いたC++の所有権システムはRustのシンプルな記述と比べると面倒で忘れたりミスしたりしてしまうがあれが限界っぽい
後方互換性を保ったままC++を快適にするのは不可能
658デフォルトの名無しさん
2023/03/28(火) 02:43:54.99ID:6yQ3WRoT >>655
そいつが書いている3つの言語ともにオブジェクト指向なのでC#は不要だろう
Pythonは普通
JavaScriptはプロトタイプ方式の継承だがそれ以外は普通
Rustは継承を排除していて機能(メソッド群)毎にトレイトで合成するがそれ以外は普通
そいつが書いている3つの言語ともにオブジェクト指向なのでC#は不要だろう
Pythonは普通
JavaScriptはプロトタイプ方式の継承だがそれ以外は普通
Rustは継承を排除していて機能(メソッド群)毎にトレイトで合成するがそれ以外は普通
659デフォルトの名無しさん
2023/03/28(火) 03:31:25.51ID:gbUXYbOA >>658
Pythonやってるやつはオブジェクト指向理解できてないやつ多いよ
JavaScriptはまぁ基本使わんし
Rustはオブジェクト指向的なことできるようにしてるけどオブジェクト指向わからんやつ向けに制限かけてるって印象
Pythonやってるやつはオブジェクト指向理解できてないやつ多いよ
JavaScriptはまぁ基本使わんし
Rustはオブジェクト指向的なことできるようにしてるけどオブジェクト指向わからんやつ向けに制限かけてるって印象
660デフォルトの名無しさん
2023/03/28(火) 05:56:18.37ID:uty8q6BB 複雑になりすぎないようにするのは、それはそれでメリットでもある
C++では、やたらとややこしいクラスが上がってくる
それ〇〇使いたいだけちゃうん、みたいな
Rustが普及したら、Rust流のスマポにみんな慣れるから、自分の母語でも使うようになるよ
C++では、やたらとややこしいクラスが上がってくる
それ〇〇使いたいだけちゃうん、みたいな
Rustが普及したら、Rust流のスマポにみんな慣れるから、自分の母語でも使うようになるよ
661デフォルトの名無しさん
2023/03/28(火) 06:40:30.67ID:qh0NVSBO >>659
その3つの言語をやってることから例えばウェブ方面だとしても
PythonでDjangoなどのフレームワークを使うにはオブジェクト指向は基本知識として不可欠
JavaScriptもReactなどののフレームワークを使うにはオブジェクト指向は基本知識として不可欠
Rustに対してはデタラメな印象だけで基礎的な理解すらなし
このスレで連投してる人の中で最もレベル低すぎ
その3つの言語をやってることから例えばウェブ方面だとしても
PythonでDjangoなどのフレームワークを使うにはオブジェクト指向は基本知識として不可欠
JavaScriptもReactなどののフレームワークを使うにはオブジェクト指向は基本知識として不可欠
Rustに対してはデタラメな印象だけで基礎的な理解すらなし
このスレで連投してる人の中で最もレベル低すぎ
662デフォルトの名無しさん
2023/03/28(火) 06:47:56.40ID:uty8q6BB C++のOOPって、CRTPとかがすっと書ける、読めるレベルだからねえ
そんな難しくないけど、美しく書くには多少の経験は必要
あと、吐かれるコードにはもうちょい気を留めてほしいなと、マシン語寄りの俺は思っちゃうな
「そういう」用途ばっかりじゃないのはわかるんだけど
そんな難しくないけど、美しく書くには多少の経験は必要
あと、吐かれるコードにはもうちょい気を留めてほしいなと、マシン語寄りの俺は思っちゃうな
「そういう」用途ばっかりじゃないのはわかるんだけど
663デフォルトの名無しさん
2023/03/28(火) 07:05:58.21ID:uty8q6BB そういや気にしてなかったけど
webも、APIがOOP式で提供されてるから、OOP無関係とは言えないけど、
自分でどんどんクラスを編み出して問題解決するC++とは、OOPに向かう姿勢は異なってくるね
クラスは簡潔なほうが、結局効率もいいんだけどねw
webも、APIがOOP式で提供されてるから、OOP無関係とは言えないけど、
自分でどんどんクラスを編み出して問題解決するC++とは、OOPに向かう姿勢は異なってくるね
クラスは簡潔なほうが、結局効率もいいんだけどねw
664デフォルトの名無しさん
2023/03/28(火) 07:15:22.07ID:qh0NVSBO >>663
それはPythonでもJavaScriptでも同じ
Web APIと関係なくプログラム独自の部分も自分でどんどんクラスを編み出して問題解決する
他を知らないためC++だけを何か特別だと思い込んでそうだな
それはPythonでもJavaScriptでも同じ
Web APIと関係なくプログラム独自の部分も自分でどんどんクラスを編み出して問題解決する
他を知らないためC++だけを何か特別だと思い込んでそうだな
665デフォルトの名無しさん
2023/03/28(火) 07:20:37.19ID:uty8q6BB >>659 をちょっとだけ擁護してみたくなっただけだよw
どこだって、ライブラリ作成者はOOPに精通してるもんだが、
C++は、OOPに精通してないと、使ってますとか公言できないもんね
むっちゃ煽られるよw その違いはあるなって思った
どこだって、ライブラリ作成者はOOPに精通してるもんだが、
C++は、OOPに精通してないと、使ってますとか公言できないもんね
むっちゃ煽られるよw その違いはあるなって思った
666デフォルトの名無しさん
2023/03/28(火) 07:41:04.68ID:qh0NVSBO OOPは精通するしないとか難しいものではないだろ
初心者かね
初心者かね
667デフォルトの名無しさん
2023/03/28(火) 07:49:36.20ID:uty8q6BB C++でOOPができるといったら、当然のようにSTLが使え、boostが使える
あるいは、traitsやattribute,constexpr を織り交ぜて、ほぼゼロサンクなバイナリを叩き出せるレベル
俺は初心者だからそのレベルにはないな
ちょっとよそよりは要求レベルは高いだろって思ってる
母語のことはちょっとだけ誇りに思ってるけど、それより、一長一短的立場
あるいは、traitsやattribute,constexpr を織り交ぜて、ほぼゼロサンクなバイナリを叩き出せるレベル
俺は初心者だからそのレベルにはないな
ちょっとよそよりは要求レベルは高いだろって思ってる
母語のことはちょっとだけ誇りに思ってるけど、それより、一長一短的立場
668デフォルトの名無しさん
2023/03/28(火) 08:58:26.51ID:C7yLEzi8 上のほうでだれかいってたけど、まともなC++erは、スマポくらい使えて当然
なんだけど…ソース単位で生ポ禁止ってのが普及しないんだよね
なんだけど…ソース単位で生ポ禁止ってのが普及しないんだよね
669デフォルトの名無しさん
2023/03/28(火) 09:04:22.01ID:u9f8RzdU newを書かなきゃ良いだけなのにね
670デフォルトの名無しさん
2023/03/28(火) 09:37:27.95ID:fedCMYV9671デフォルトの名無しさん
2023/03/28(火) 09:39:21.00ID:fedCMYV9672デフォルトの名無しさん
2023/03/28(火) 09:56:21.67ID:cZnvlJgt >>661
君がオブジェクト指向理解できてなさそう
君がオブジェクト指向理解できてなさそう
673デフォルトの名無しさん
2023/03/28(火) 10:06:33.49ID:C7yLEzi8 >>669
C++も なんでもスタックに置きたいんだけど、きつきつなのが本来なんだよね
どんどんスタックを食うのは野暮っていう流儀もある
Rust流はメモリ使用の局所化を促進するから、
メモリキャッシュまで考慮すると、悔しいけどC++より効率出る余地がある
まあ実測してみないと、知らんけどw
C++も なんでもスタックに置きたいんだけど、きつきつなのが本来なんだよね
どんどんスタックを食うのは野暮っていう流儀もある
Rust流はメモリ使用の局所化を促進するから、
メモリキャッシュまで考慮すると、悔しいけどC++より効率出る余地がある
まあ実測してみないと、知らんけどw
674デフォルトの名無しさん
2023/03/28(火) 10:06:36.56ID:vBvHBfxi >どんどんクラスを編み出して問題解決する
奴はクラスを書けたらオブジェクト指向を理解してると思ってるみたいだからな
奴はクラスを書けたらオブジェクト指向を理解してると思ってるみたいだからな
675デフォルトの名無しさん
2023/03/28(火) 10:09:59.68ID:fedCMYV9676デフォルトの名無しさん
2023/03/28(火) 10:28:38.80ID:u9f8RzdU677デフォルトの名無しさん
2023/03/28(火) 10:51:13.90ID:P0df9Gxx JavaScriptとPythonは
極力オブジェクト指向的な書き方をしないほうが
メンテナンス性も可読性も高まる言語だから
C++やC#とは事情が違うわな
極力オブジェクト指向的な書き方をしないほうが
メンテナンス性も可読性も高まる言語だから
C++やC#とは事情が違うわな
678デフォルトの名無しさん
2023/03/28(火) 17:06:18.21ID:aUMSgZvE >>662
CRTPはC++のOOPで最も効率よい実装となり必須なテクニックであるが
美しいというのはウソでむしろC++の汚さの象徴の一つになっている
初心者や他言語の人たちもいるようだからわかりやすいコード
例として各派生のadd1()を用いて共通のadd2()やadd3()などを用意する場合
template<typename T>
struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
void add3 ...略
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
以上となり慣れてしまうと感覚が麻痺してしまうが
CRTP (Curiously Recurring Template Pattern)の名の通り
「Foo : AddN<Foo>」といちいち自分をパタメータとして与えなければならない
「static_cast<T*>(this)」といちいちダウンキャストをしなければならない
このように「美しくない無駄なコード」になっている
つづく
CRTPはC++のOOPで最も効率よい実装となり必須なテクニックであるが
美しいというのはウソでむしろC++の汚さの象徴の一つになっている
初心者や他言語の人たちもいるようだからわかりやすいコード
例として各派生のadd1()を用いて共通のadd2()やadd3()などを用意する場合
template<typename T>
struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
void add3 ...略
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
以上となり慣れてしまうと感覚が麻痺してしまうが
CRTP (Curiously Recurring Template Pattern)の名の通り
「Foo : AddN<Foo>」といちいち自分をパタメータとして与えなければならない
「static_cast<T*>(this)」といちいちダウンキャストをしなければならない
このように「美しくない無駄なコード」になっている
つづく
679デフォルトの名無しさん
2023/03/28(火) 17:07:43.55ID:aUMSgZvE >>678のつづき
一方でRustではトレイトを用いて以下のコードとなる
C++での「美しくない無駄なコード」部分を消し去った状況とほぼ一致している
trait AddN {
fn add1(&mut self);
fn add2(&mut self) {
self.add1();
self.add1();
}
fn add3 ...略
}
struct Foo(i32);
impl AddN for Foo {
fn add1(&mut self) {
self.0 += 1;
}
}
逆にRustのこのコードと同じことを同じようにゼロコストで実現するには
C++ではCRTPを「美しくない無駄なコード」とはいえ使わざるをえない
一方でRustではトレイトを用いて以下のコードとなる
C++での「美しくない無駄なコード」部分を消し去った状況とほぼ一致している
trait AddN {
fn add1(&mut self);
fn add2(&mut self) {
self.add1();
self.add1();
}
fn add3 ...略
}
struct Foo(i32);
impl AddN for Foo {
fn add1(&mut self) {
self.0 += 1;
}
}
逆にRustのこのコードと同じことを同じようにゼロコストで実現するには
C++ではCRTPを「美しくない無駄なコード」とはいえ使わざるをえない
680デフォルトの名無しさん
2023/03/28(火) 17:58:49.48ID:C7yLEzi8681デフォルトの名無しさん
2023/03/28(火) 20:04:32.17ID:jfKwOIRn >>679
CRTPを使わないで仮想関数にすると実行時のvtable経由のオーバーヘッドがあるんだよな
Rustは何も指定しなくてもCRTPと同じ状況になるから記述はシンプルで実行時オーバーヘッドもなく速いわけか
CRTPを使わないで仮想関数にすると実行時のvtable経由のオーバーヘッドがあるんだよな
Rustは何も指定しなくてもCRTPと同じ状況になるから記述はシンプルで実行時オーバーヘッドもなく速いわけか
682デフォルトの名無しさん
2023/03/28(火) 20:17:15.74ID:fedCMYV9 そういえば初心者向けのサイト無いな
アイペンテックとか?
アイペンテックとか?
683デフォルトの名無しさん
2023/03/28(火) 20:32:01.59ID:iKmwqFtY C++のオブジェクト指向は動的ポリモーフィズムだから遅い
関数呼び出しのvtableオーバーヘッドがあるだけでなくインライン展開ができず最適化の機会も失われている
Rustは基本が静的ポリモーフィズムだからそれらのコストがなく速い
関数呼び出しのvtableオーバーヘッドがあるだけでなくインライン展開ができず最適化の機会も失われている
Rustは基本が静的ポリモーフィズムだからそれらのコストがなく速い
684デフォルトの名無しさん
2023/03/28(火) 20:33:07.14ID:QUV/Fh6a CRTP使うと全部インライン展開されるのマジで不思議だよな
685デフォルトの名無しさん
2023/03/28(火) 21:00:58.63ID:HSIaJTs3686デフォルトの名無しさん
2023/03/28(火) 21:30:24.26ID:pvMX8JEc >>627
Rubyの話はもういいよ
Rubyの話はもういいよ
687デフォルトの名無しさん
2023/03/28(火) 21:35:05.32ID:iKmwqFtY >>684
CRTPを使えば常にインライン展開されるわけではない
CRTPを使った時のみ(vtable経由にならず静的に動作が確定するため)インライン展開が可能となり最適化の可能性も広がり速くなるという話
C++ではCRTPを使わないとRustと同等の速さになれない
CRTPを使えば常にインライン展開されるわけではない
CRTPを使った時のみ(vtable経由にならず静的に動作が確定するため)インライン展開が可能となり最適化の可能性も広がり速くなるという話
C++ではCRTPを使わないとRustと同等の速さになれない
688デフォルトの名無しさん
2023/03/28(火) 22:58:28.07ID:rZiXTukV vtableが重く感じるとかどんな環境やねん。どうせエアプやろ。
689デフォルトの名無しさん
2023/03/28(火) 23:08:36.42ID:u9f8RzdU 呼び出し回数多いと馬鹿にならんよ
690デフォルトの名無しさん
2023/03/29(水) 00:01:28.04ID:jlgG+N1i vtableが重いというよりインライン展開+αの最適化が効かなくなるのが問題なんでしょ
使ってる関数が常に固定値(nullとか)を返すって事前に分かればそれによって分岐の整理ができたりするけど
間にvtableが挟まるとそういう予測が難しくなる
使ってる関数が常に固定値(nullとか)を返すって事前に分かればそれによって分岐の整理ができたりするけど
間にvtableが挟まるとそういう予測が難しくなる
691デフォルトの名無しさん
2023/03/29(水) 00:09:55.54ID:jqKX3lj0 >>687
CRTPを使わないと真に実現できないのはメソッド記法だけ
そしてvtableとインライン展開に君が想像するような関係性は無い
というか、同じ推論をRustで適用すれば「object-safeなtraitへのimplはvtableを量産しインライン展開を阻害するので悪、やめろ」ということにならないかい?
自分が何を書こうとしているのかよく考えてから書き込むことだ
CRTPを使わないと真に実現できないのはメソッド記法だけ
そしてvtableとインライン展開に君が想像するような関係性は無い
というか、同じ推論をRustで適用すれば「object-safeなtraitへのimplはvtableを量産しインライン展開を阻害するので悪、やめろ」ということにならないかい?
自分が何を書こうとしているのかよく考えてから書き込むことだ
692デフォルトの名無しさん
2023/03/29(水) 00:26:00.18ID:hbkToQM4 C++もRustも、OOPなアセンブラの用途があるからね
少々vtableを経ても平気だとしても、そういうバイナリ吐いてほしくないときはある
バイナリは覗かれるもの
少々vtableを経ても平気だとしても、そういうバイナリ吐いてほしくないときはある
バイナリは覗かれるもの
693デフォルトの名無しさん
2023/03/29(水) 02:17:33.72ID:0e8thR9U こういうしょーもない連中に限ってvtableによって速度が何%落ちるかなんて測ったこともないんだよ。
馬鹿馬鹿しい。
馬鹿馬鹿しい。
694デフォルトの名無しさん
2023/03/29(水) 03:03:32.31ID:F3x5gAOr695デフォルトの名無しさん
2023/03/29(水) 08:27:05.33ID:hbkToQM4 >>693
パフォーマンスを測るまでもなく、吐かれるバイナリの汚さ
書いた一言一句が何になるか、気になって仕方ないのがC++erだよ(諸派あり、用途にもよる
バイナリエディタに放り込んだらわかるまである
パフォーマンスを測るまでもなく、吐かれるバイナリの汚さ
書いた一言一句が何になるか、気になって仕方ないのがC++erだよ(諸派あり、用途にもよる
バイナリエディタに放り込んだらわかるまである
696デフォルトの名無しさん
2023/03/29(水) 08:41:42.91ID:jqKX3lj0697デフォルトの名無しさん
2023/03/29(水) 09:39:43.93ID:gptXJHJd この英語版wikipediaのC++サンプルコードとコンパイル結果が詳しい
https://en.wikipedia.org/wiki/Virtual_method_table#Example
CRTPを使わないとvirtual method tableが出てきて不利になる
https://en.wikipedia.org/wiki/Virtual_method_table#Example
CRTPを使わないとvirtual method tableが出てきて不利になる
698デフォルトの名無しさん
2023/03/29(水) 10:58:30.49ID:DCEr0ZuV CRTPが嫌ならテンプレート分ければいいだけでは?
699デフォルトの名無しさん
2023/03/29(水) 11:49:15.76ID:KmrCY6Bh >>678
これってダウンキャスト入ってるから危険なこともできそう
相当するコードはRustではコンパイル通らない?
#include <iostream>
#define DOUT(arg) std::cout << #arg": " << arg << std::endl
template<typename T> struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
struct Bar : AddN<Foo> {
double y;
Bar(double i) : y(i) {}
void add1() {
this->y+=0.1;
}
};
int main () {
Foo foo (1); Bar bar (0.1);
DOUT (foo.x); DOUT (bar.y);
foo.add1 (); bar.add1 ();
DOUT (foo.x); DOUT (bar.y);
return 0;
}
これってダウンキャスト入ってるから危険なこともできそう
相当するコードはRustではコンパイル通らない?
#include <iostream>
#define DOUT(arg) std::cout << #arg": " << arg << std::endl
template<typename T> struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
struct Bar : AddN<Foo> {
double y;
Bar(double i) : y(i) {}
void add1() {
this->y+=0.1;
}
};
int main () {
Foo foo (1); Bar bar (0.1);
DOUT (foo.x); DOUT (bar.y);
foo.add1 (); bar.add1 ();
DOUT (foo.x); DOUT (bar.y);
return 0;
}
700デフォルトの名無しさん
2023/03/29(水) 11:51:44.76ID:KmrCY6Bh 実行したら以下のようになった
$ ./a.out
foo.x: 1
bar.y: 0.1
foo.x: 2
bar.y: 0.2
最後のbar.yは1.1になると思ってたんだがはて?
$ ./a.out
foo.x: 1
bar.y: 0.1
foo.x: 2
bar.y: 0.2
最後のbar.yは1.1になると思ってたんだがはて?
701デフォルトの名無しさん
2023/03/29(水) 12:42:03.29ID:KmrCY6Bh そもそもBarはFooを継承してないんだから
ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
何で通すんだろ? templateだとチェックを緩和してるのかな?
あるいはコンパイラのバグかな?
$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
何で通すんだろ? templateだとチェックを緩和してるのかな?
あるいはコンパイラのバグかな?
$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
702デフォルトの名無しさん
2023/03/29(水) 12:43:14.11ID:KmrCY6Bh -ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
+static_cast<T*>(this)->add1();のところでコンパイルエラー出て良いようなもんだけど
+static_cast<T*>(this)->add1();のところでコンパイルエラー出て良いようなもんだけど
703デフォルトの名無しさん
2023/03/29(水) 12:55:36.31ID:jlgG+N1i 最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
doubleをint扱いして1足しても1/(2^53)(←不正確、指数部による)くらいしか変動しないのかな
FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
Rustはクラス継承がないからstatic_castとの正確な比較はできない
traitで似たようなコード書くときはSelfキーワードで自分の型を指すからダウンキャスト必要ないし
敢えてstatic_castと対応させるならtransmuteだろうけどunsafe付きの関数だから危険でもコンパイルは通せる
(unsafeを使う範囲の安全性保証はプログラマの責任)
doubleをint扱いして1足しても1/(2^53)(←不正確、指数部による)くらいしか変動しないのかな
FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
Rustはクラス継承がないからstatic_castとの正確な比較はできない
traitで似たようなコード書くときはSelfキーワードで自分の型を指すからダウンキャスト必要ないし
敢えてstatic_castと対応させるならtransmuteだろうけどunsafe付きの関数だから危険でもコンパイルは通せる
(unsafeを使う範囲の安全性保証はプログラマの責任)
704デフォルトの名無しさん
2023/03/29(水) 13:10:19.46ID:KmrCY6Bh >>703
>最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
あーごめんごめん!興味があったのはadd2を呼んだときの挙動だった
- foo.add1 (); bar.add1 ();
+ foo.add2 (); bar.add2 ();
$ ./test
foo.x: 1
bar.y: 0.1
foo.x: 3
bar.y: 0.1 <- 鼻から悪魔
>FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
なるほどキャストしているthisはAddN<Foo>*だから
Foo*にもBar*にもダウンキャストできるってことね
ありがとう
>最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
あーごめんごめん!興味があったのはadd2を呼んだときの挙動だった
- foo.add1 (); bar.add1 ();
+ foo.add2 (); bar.add2 ();
$ ./test
foo.x: 1
bar.y: 0.1
foo.x: 3
bar.y: 0.1 <- 鼻から悪魔
>FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
なるほどキャストしているthisはAddN<Foo>*だから
Foo*にもBar*にもダウンキャストできるってことね
ありがとう
705デフォルトの名無しさん
2023/03/29(水) 13:47:10.36ID:KmrCY6Bh 正当?なC++的にはdynamic_castすべきなんじゃなかろうかって思うんだよね
でそれはvtable介してadd1にアクセスするのと変わらない
プログラマの責任でstatic_castして効率化する
ってテクニックは俺は割と好きだけども
でそれはvtable介してadd1にアクセスするのと変わらない
プログラマの責任でstatic_castして効率化する
ってテクニックは俺は割と好きだけども
706デフォルトの名無しさん
2023/03/29(水) 14:18:14.91ID:JN59fMMe >>703
transmuteはダウンキャストではなく任意の型同士の強引な型変換(読み替え)だから当然unsafe
一方でダウンキャストは親から子、基底から派生、抽象から具体への変換を指す
Rustの場合は抽象的なトレイトから具体的な型への変換がダウンキャストとなる
Rustは基本的には静的ポリモーフィズムで
コンパイル時点で各具体的な型のコードへ安全に置き換わるモノモーフィズムなので
C++のstatic_castのような危険のあるダウンキャストを必要としないが正解
Rustでもdyn Traitを用いた場合のみ動的ポリモーフィズムとなり
C++のdynamic_castと同様に実行時ダウンキャストがdowncast()/downcast_ref()/downcast_mut()で可能だが
C++とは異なりRustはNull安全でダウンキャストできる
transmuteはダウンキャストではなく任意の型同士の強引な型変換(読み替え)だから当然unsafe
一方でダウンキャストは親から子、基底から派生、抽象から具体への変換を指す
Rustの場合は抽象的なトレイトから具体的な型への変換がダウンキャストとなる
Rustは基本的には静的ポリモーフィズムで
コンパイル時点で各具体的な型のコードへ安全に置き換わるモノモーフィズムなので
C++のstatic_castのような危険のあるダウンキャストを必要としないが正解
Rustでもdyn Traitを用いた場合のみ動的ポリモーフィズムとなり
C++のdynamic_castと同様に実行時ダウンキャストがdowncast()/downcast_ref()/downcast_mut()で可能だが
C++とは異なりRustはNull安全でダウンキャストできる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★2 [BFU★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★4 [Hitzeschleier★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 [Hitzeschleier★]
- ホリエモン、「持ち家=幸せという価値観は過去のもの」と断言「快適な住まいが欲しいなら、賃貸住宅を次々に替えていく」 [muffin★]
- 高市早苗総理「金利上昇よりも日本の成長が大事」 ★3 [Hitzeschleier★]
- 【実況】博衣こよりのえちえちスーパーダンガンロンパ2🧪
- 今さっき西谷駅でゲロ吐いてしれっと逃げたやつ
- 自民党のヒゲ「日本側の無線でcopyとは言ったが了解という意味ではない」 [834922174]
- 【新番組】轟はじめ🐧⚡のぶんぶんぶーん🚗💨!【🏡】
- だから野球回がないアニメはクソアニメだって俺最初から言ってたじゃん
- もちもち食感って言葉があるけど、私も餅ってもちもちしてないよな
