探検
結局C++とRustってどっちが良いの?
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2023/02/25(土) 09:49:46.74ID:VRyB88xR C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
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安全でダウンキャストできる
707デフォルトの名無しさん
2023/03/29(水) 14:59:38.14ID:hbkToQM4 そこは、わずかにコストを支払って、reinterpret_castでもいいとは思うけどね
708デフォルトの名無しさん
2023/03/29(水) 15:00:17.60ID:hbkToQM4 ああちがう、reinterpret_castを避ける、だ
709デフォルトの名無しさん
2023/03/29(水) 15:30:35.32ID:jlgG+N1i 動的検査のコストよりもキャストに失敗した時の分岐処理のせいで最適化が阻害されるのを問題視してる感じ
かといって分岐しないなら動的検査の意味ないし
かといって分岐しないなら動的検査の意味ないし
710デフォルトの名無しさん
2023/03/29(水) 15:35:36.31ID:jd4hHaC+711デフォルトの名無しさん
2023/03/29(水) 15:40:07.88ID:R/bWJVR7 Rustのポインタ(参照)のNull安全ってすごく上手い仕組みだな
C++のdynamic_castもRustのdowncast_refも生成コードはどちらもダウンキャスト成功時はそのままポインタを返して失敗時は0を返す点で効率も同じだけど
Rustでは返す型としてはそれをポインタで直接に表さずにOption<&T>を返すと表現させて
成功時はOption::Some(&T)を返して失敗時の0はOption::Noneとして返すため
プログラムコード上はNoneかSomeか生成コードでは0か否かをチェックせずには使えないわけだ
C++でのNullポインタか否かのチェック忘れを静的な型チェックで防止できるってことは
もしかしてC++でもdynamic_castやその他のNullポインタを返すライブラリ全てをstd::optionalを返すように変更すればNull安全になるんじゃないか?
C++のdynamic_castもRustのdowncast_refも生成コードはどちらもダウンキャスト成功時はそのままポインタを返して失敗時は0を返す点で効率も同じだけど
Rustでは返す型としてはそれをポインタで直接に表さずにOption<&T>を返すと表現させて
成功時はOption::Some(&T)を返して失敗時の0はOption::Noneとして返すため
プログラムコード上はNoneかSomeか生成コードでは0か否かをチェックせずには使えないわけだ
C++でのNullポインタか否かのチェック忘れを静的な型チェックで防止できるってことは
もしかしてC++でもdynamic_castやその他のNullポインタを返すライブラリ全てをstd::optionalを返すように変更すればNull安全になるんじゃないか?
712デフォルトの名無しさん
2023/03/29(水) 15:45:49.19ID:RttupHdJ713デフォルトの名無しさん
2023/03/29(水) 17:50:54.05ID:aWl/4JyA714デフォルトの名無しさん
2023/03/29(水) 18:18:44.67ID:eKurmGUm たぶん人違いじゃないかな?
dynamic_castの返り値を確認しないやつは
流石におらんと思うよ
静的に確認してくれても全く嬉しくない
dynamic_castの返り値を確認しないやつは
流石におらんと思うよ
静的に確認してくれても全く嬉しくない
715デフォルトの名無しさん
2023/03/29(水) 18:19:38.85ID:eKurmGUm 訂正
静的に確認を強制されても嬉しくない
静的に確認を強制されても嬉しくない
716デフォルトの名無しさん
2023/03/29(水) 18:50:51.61ID:3DtieHtv ヌルポインタが返る全ての関数についてそうしないとヌル安全にならない
ヌルを使ってはダメ
ヌルを使ってはダメ
717デフォルトの名無しさん
2023/03/29(水) 19:05:30.65ID:KmrCY6Bh それは当然だよ
C++では指し示した先にインスタンスがあるかどうか
分からんときにのみポインタを使う
確実にあるときは参照を使うのが流儀
ポインタが使われるところではnullptrのチェックを行う
この流儀の部分を守らないスカタンが問題なんだな
Cに参照がないので上記流儀が守られないことも問題
C++では指し示した先にインスタンスがあるかどうか
分からんときにのみポインタを使う
確実にあるときは参照を使うのが流儀
ポインタが使われるところではnullptrのチェックを行う
この流儀の部分を守らないスカタンが問題なんだな
Cに参照がないので上記流儀が守られないことも問題
718デフォルトの名無しさん
2023/03/29(水) 19:30:08.82ID:ap6Xt56V719デフォルトの名無しさん
2023/03/29(水) 19:36:28.24ID:KmrCY6Bh >>718
BarはAddN<Bar>ではなくAddN<Foo>を継承しているから
BarはAddN<Bar>ではなくAddN<Foo>を継承しているから
720デフォルトの名無しさん
2023/03/29(水) 19:41:07.31ID:ap6Xt56V721デフォルトの名無しさん
2023/03/29(水) 19:53:07.69ID:KmrCY6Bh templateを展開すると
void Add <Foo>::add2() {
static_cast<Foo*>(this)->add1();
static_cast<Foo*>(this)->add1();
}
thisはBarの基底AddN<Foo>*のポインタ
これをBarと無関係のFoo*にキャストしたら動作は不定
void Add <Foo>::add2() {
static_cast<Foo*>(this)->add1();
static_cast<Foo*>(this)->add1();
}
thisはBarの基底AddN<Foo>*のポインタ
これをBarと無関係のFoo*にキャストしたら動作は不定
722デフォルトの名無しさん
2023/03/29(水) 20:09:37.10ID:ap6Xt56V なるほど
浮動小数点に対してそれを整数と見て+2してしまっているのかな
本来はコンパイル段階でエラーにしないとやばそうだ
今回はっきり動いていないとわかるケースだからいいけど何となく動いてしまってるケースがあると恐ろしい
浮動小数点に対してそれを整数と見て+2してしまっているのかな
本来はコンパイル段階でエラーにしないとやばそうだ
今回はっきり動いていないとわかるケースだからいいけど何となく動いてしまってるケースがあると恐ろしい
723デフォルトの名無しさん
2023/03/29(水) 20:11:29.28ID:KmrCY6Bh 正当?なC++的にはdynamic_castすべきだと思うんだよね
template<typename T> struct AddN {
void add2() {
dynamic_cast<T&>(*this).add1();
dynamic_cast<T&>(*this).add1();
}
virtual ~AddN () {};
};
template<typename T> struct AddN {
void add2() {
dynamic_cast<T&>(*this).add1();
dynamic_cast<T&>(*this).add1();
}
virtual ~AddN () {};
};
724デフォルトの名無しさん
2023/03/29(水) 20:13:55.05ID:AtW1ukjc 静的に一意に決まるんならいいのでは
725デフォルトの名無しさん
2023/03/29(水) 20:29:34.23ID:KmrCY6Bh 俺は割と好きだけどもね
726デフォルトの名無しさん
2023/03/29(水) 20:42:15.15ID:rGt9yURA C++最適化効きすぎてadd2そのものが展開されて最短コードにしかならん
727デフォルトの名無しさん
2023/03/29(水) 20:50:49.78ID:ij9aGzzi doubleのビット列をintとして扱ってインクリメントしてるから結果がおかしいんだろ
なぜコンパイラは型不一致エラーを出せないんだ?
なぜコンパイラは型不一致エラーを出せないんだ?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★3 [BFU★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★5 [Hitzeschleier★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 ★2 [Hitzeschleier★]
- 【自民再生】高市補正予算、よく分からない事業目白押し!国民が幸せになれる予算かな? [219241683]
- 【すこん部🏡】白上フブキ🦊配信中❗【ホロライブ▶】
- 近所にびっくりドンキーがないんだけど!!!
- 【実況】博衣こよりのえちえちスーパーダンガンロンパ4🧪
- 【安倍晋三】中国船4隻が領海侵入 [828897501]
- 株やりたいんやが 億トレっていまだにパソコンで株やってんの?
