「クラスを使ったら遅くなるか?」を検証したいのではなくて、
「クラスを使ったら遅くなる」っていう”盲信”を誰かに
”本当です”っていってほしかっただけにしかみえないんだよなあ・・・
>>意識する必要があるのは、仮想関数、仮想継承、多重継承等を使う時でしょう。
ここを無視してクラスそのものを使っちゃいけないって信じちゃってるみたいで、
痛いわ
「クラスを使ったら遅くなるか?」を検証したいのではなくて、
「クラスを使ったら遅くなる」っていう”盲信”を誰かに
”本当です”っていってほしかっただけにしかみえないんだよなあ・・・
>>意識する必要があるのは、仮想関数、仮想継承、多重継承等を使う時でしょう。
ここを無視してクラスそのものを使っちゃいけないって信じちゃってるみたいで、
痛いわ
>ええ。なんか全体的にここ中級者が初級者を戸惑わせる言動に満ち溢れてるきが
>しますねぇ。大丈夫でしょうか。
初心者の
「ゲームを作っているが速度が遅い。クラスを使うと遅くなるか」
という問いに対しては、
>ガセネタです
で充分な回答だと思います。
逆に「クラスを使うと遅い」という
(「どういう局面で」という情報が抜け落ちた)知識を得て、
極力クラスを使わないでコードを書くような
癖をつけてしまうほうが危険です。
クラスを使うことによるオーバーヘッドが影響を及ぼすほど
他の部分を最適化できる人であればもう初心者ではないでしょう。
そのあたりは、最初のPAIさんの回答の通りです。
C++でのパフォーマンス戦略に関しては
Efficient C++ を一読されることをお勧めします。
『クラスを使うことによって』遅くなるのではない。
ということがわかっていただけるかと思います。
超連射68k っていう、シューティングゲームしってますか?
その昔 x68000 ってパソコン用に作られた
いわゆる同人シューティングゲームです。
そのへんの商業ソフトを軽く凌駕する
x68000 のソフトとは思えないほどの代物で、
誰もが(少なくとも わたしは)フルアセンブラで
記述してると思いましたよ。
でも、実際は…
[引用]
X68K オリジナル版は、C 言語記述 90%、アセンブラ記述 10% で構成されていました。
速度重視でない部分は、C 言語で記述して開発効率を優先し、 ここぞという部分はアセンブラ
で記述して速度を稼ぐというスタイルでした。
規模が大きくなってくるとともに、 コンパイルに要する時間が嵩み、開発は難航しました。 そ
れでも C 言語を選択した理由は、 やはりそれを上回る開発効率面でのメリットがあったから
です。
[引用終]
でした。
これを どう受け取るかについては関知しませんが。
<!--
今時、PS2 での開発だって普通に C++ だと思うだけどなぁ…
コンパイラが最適化しやすいコードを書くので十分と思うがなぁ…
クラスがどうコンパイルされるか想像すれば、どの程度のオーバーヘッドかも分かる気がするん
だけどなぁ…
http://www2.tky.3web.ne.jp/~yosshin/memo/990326.html これを読むと仮想関数テーブル
のオーバーヘッドなんて 多くの場面では無いも同然に思えるんだなぁ…
「yaneSDK」あたりを使ってみて、クラスベースのプログラミングが本当に遅いか試してみると
いいと思うんだなぁ…
なにより完璧にこだわりすぎるとモノが完成しない。遅くても完成したほうがマシなんだなぁ…
(経験談)
-->
もう少し建設的に言い直してみます。
たしか9:1の原則というのがあって
処理時間の9割は1割のコードが
費やしているんだそうです。
ほとんどのコードは1ループで1回きり、
もしくは実行されないですが、
一部のコードについてはそれこそ
何百、何千回と呼び出される訳です。
9割のコードに要する処理時間を
仮にゼロに出来たところで1割しか高速化できません。
ですが、例の1割の部分、いわゆるコアになる場所を
仮に5割だけ処理時間を削減できたとしましょう。
コアの性能が2倍になるわけですが、
これだけでトータル性能は2倍弱です。
実際にはアルゴリズムを根本から変えることで
性能が10倍20倍になることもまれではないわけです。
つまり、広い視野でみれば
C++ を、クラスを使うことで楽ができるのなら、
コーディング時間を短縮できるのならば
楽をした分をコアの高速化に集中するのが一番得策なのです。
1+1を計算するためにクラスを使えなどと言いません。
たしかに「遅くなる」でしょう。
でも、オブジェクト指向設計をすることで
全体でみたときにコーディング時間短縮が可能だったら?
そういう視点で見た方がよいと思います。
速度を気にする人は
コードもたいていまともなものを書いてくれるという
期待ができて良いのですが、
完璧主義になりやすく、プログラム全体に
全力を尽くしてしまいがちなのでもったいないですね。
と、まぁ、わたしも昔は完璧主義・理想主義だったので
気持ちは よーーーく分かります。
同じ理由で C を使おうとしてた時期もありましたし。
今は C++ のほうが(考えるのが)楽でいいや~って感じですが。
(今は現実主義者。MS&C# 大好き)
ERさんやくたくたさんに質問。
> 意識する必要があるのは、仮想関数、仮想継承、多重継承等を使う時でしょう。
> これらは使わない時に比べ、機能実現の為のオーバーヘッドコードが生成されます。
このオーバーヘッドは何に対してですか?
本来,仮想関数が必要とされているところで,
仮想関数を使わないという選択をしたとしても,
仮想関数のシミュレートによる追加分でオーバーヘッドは相殺されませんか?
もちろん,
void foo (int);
を呼び出す方が,
struct bar {
virtual void foo (int);
};
を呼び出すよりもコストが低いのは確かです。
#前者はコンパイル時に解決のためのコストを払っているのですから。
しかし,
struct bar {
enum Type {
BAR,
BAR2,
BAR3, /* ... */
} type;
};
void foo (bar & This, int)
{
switch (This.type) {
case BAR:
/*
barに対する処理
*/
なんてやるより,コストは低くなりますよ。
#最初に関数ポインタに代入は基本的に仮想関数と変わらないから無視。
> 事実、記述機能を使ったコードと使わないコードでは、全く同じ処理内容でも
> 4次ベクトル内積演算 数百~数千回分の差が出る事もあります。(これはでかい!)
又、
そりゃ,必要のないものまでvirtual付ければ速度は落ちるでしょうよ……。
もう既に当事者は読んでないような気もしますけれど、
επιστημηさんも言われてましたが、
質問内容からその手のプログラムに精通した人とは思えなかったので
回答者は初心者だろうと判断してああいう回答になったのかと思います。
問題をミクロに突き詰めて云々というような質問の仕方ではなかったので。
私も書きましたが、結局使い方によるというのは正しい解答だと思います。
クラス=遅いではなくて
使い方が悪い、クラス設計がまずいから遅くなるのではないですか?
マクロな視点から考えれば、間違った解答ではないと思いますけれど。
むしろ、初心者に対しては、クラス=遅いという認識を持つ方が
マイナスだというのは私も同意見です。
後質問者の方がわかってないという言い方をされてますけれど、
最初の質問内容であなたが言われているところまで深読みしろという方が
無理なんでは?
こちらは書かれている文章で判断するしかないんですから。
YoOさん、初めまして。
>仮想関数のシミュレートによる追加分でオーバーヘッドは相殺されませんか?
されます。関数ポインタLUTを使って自前で多態させるなら相殺どころか負債です。
が、僅かな手間をかけswitch文で置換すると、試行した全状況で速くなる事実がありました。
(PC/組み込みに関わらず)
>必要のないものまでvirtual付ければ速度は落ちるでしょうよ……。
つけておりません。
要点は
「本当ですか?という問いに対して、場合によりYes とお答えしたかった」
という事です。
C++固有の機能は肯定しています。
さもなければC++を採用する意味が無いであろう為です。
既に蛇足ですが、どうしても書きたかったので。
くたくたさんのおっしゃることは良くわかります。
PAIさんの話にしてもそういう意味で書かれていたと私は思います。
ただ、深く書いても混乱を招くだけという判断をされたのだと私は
思います。
くたくたさんは、
o ゲームソフトにおいて、「細かいオーバーヘッド関するコスト意識が
ある人と無い人では、作られたソフトのあらゆる質に雲泥の差が出る」
という現実がある事
o 予め知っておくと得であろうという事
o 今回の質問の場合、まさにそのケースに該当する事
o MS-C/C++の設計&実装の担当者の一人が この問題を公に説明している事
と判断されたわけですが、
最初の質問の内容からそれを推測することは多分無理だと思います。
(特に3番目については無理でしょう)
ERさんのほかの書き込みをすべて読めばわかったのかもしれませんが、
回答する側にそれを期待するのはERさんのわがままだと思います。
ERさんが自分の期待する答えがほしかったのであれば、
初めてERさんの質問を読んだ人間にもくたくたさんのような判断が出来る
質問の仕方をすべきだったのだと私は思います。
あんまり書きたくないのですが^^;;
質問の仕方については単なる前兆ですからある質問に、「本当?」「うん」
で終わらす話もないじゃないですか。普通は「ただ・・」とか付け加えるものです。
その変の勉強もしておいたほうがいいでしょうか。
それとなんか雰囲気的にERはわかってないとか思われてますけど、
クラスの使い方十分わかりましたので。^^;
それとあれは別に深いってほどのことでもないので^^;
PATIOさん、初めまして。
>くたくたさんのおっしゃることは良くわかります。
ありがとうございます。が、スレッド「くたくた 2003/08/01(金) 11:15:02」は、
同意を求めたり反論したい訳ではないですよ!
完結している為、これ以上の返信は もはや不要と思っておりました。
しかし、返答を求められた為にお答え致しました。
あと、いくつかの推測を前提にお話したのは 手っ取り早く完結させたかった
(逐一不明瞭な所を指摘するやりとりを排除したかった)為です。
以上で終わりにしたいと思います。
わかってる人間は クラスを使う なんていう微妙な表現はせんだろ。