トップページ > プログラム > 2015年02月24日 > lOtrXj7U

書き込み順位&時間帯一覧

1 位/206 ID中時間01234567891011121314151617181920212223Total
書き込み数00000000000012012411100013



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
942
C++相談室 part115 [転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part115 [転載禁止]©2ch.net
942 :デフォルトの名無しさん[]:2015/02/24(火) 12:52:14.82 ID:lOtrXj7U
メソッドが派生クラスでオーバーライドされてるか判定するのに以下のようにしたら
一応うまくいったけど、GCCで-fpermissiveをつけないとコンパイルエラーになる
-fpermissiveをつけないでうまく行く方法があったら教えてください!

#include <stdio.h>

class Base { public: virtual void print() {} };
class Derive0 : public Base { public: virtual void print() {} };
class Derive1 : public Base {};

void IsOverride(void (Base::*p)()) { printf("Base::print\n"); }
void IsOverride(void (Derive0::*p)()) { printf("Derive0::print\n"); }
void IsOverride(void (Derive1::*p)()) { printf("Derive1::print\n"); }

int main(int argc, char* argv[]) {
Base* base = new Base();
Derive0* derive0 = new Derive0();
Derive1* derive1 = new Derive1();
IsOverride(&base->print); //→ Base::print
IsOverride(&derive0->print); //→ Derive0::print
IsOverride(&derive1->print); //→ Base::print
}
C++相談室 part115 [転載禁止]©2ch.net
944 :デフォルトの名無しさん[sage]:2015/02/24(火) 13:50:08.22 ID:lOtrXj7U
>>943
目的は速度最適化
例えば大量の派生クラスのオブジェクトがあったとして
事前にオーバーライドされてない事が分かったら、
ループしてメソッド呼び出しをごっそり削除できる
(Base::printは何もしないとわかってるので)
C++相談室 part115 [転載禁止]©2ch.net
945 :デフォルトの名無しさん[sage]:2015/02/24(火) 13:57:06.95 ID:lOtrXj7U
>>944
事前に選り分けておくから確実に速くなる事は間違いないけどどれだけ速くなるかは不明…
C++相談室 part115 [転載禁止]©2ch.net
949 :942[sage]:2015/02/24(火) 15:27:24.93 ID:lOtrXj7U
>>946-948
すんません、例が間違ってました
Base* base = new Base();
Base* derive0 = new Derive0();
Base* derive1 = new Derive1();
IsOverride(&base->print); //→ Base::print
IsOverride(&derive0->print); //→ Base::print
IsOverride(&derive1->print); //→ Base::print

という事で出来ませんでした…
多分vtblの中身を確認するような方法じゃないと無理っぽい
ポータブルな方法でなくてもいいので、もしお分かりになるようでしたら教えてください
自分も調べてみます…
C++相談室 part115 [転載禁止]©2ch.net
951 :デフォルトの名無しさん[sage]:2015/02/24(火) 16:00:11.74 ID:lOtrXj7U
>>950
単なる最適化なんで基本的にderivedはそれ用の処理を強制したくは無いです
baseに何か仕込むのは問題ないです
C++相談室 part115 [転載禁止]©2ch.net
954 :デフォルトの名無しさん[sage]:2015/02/24(火) 16:18:50.73 ID:lOtrXj7U
>>952
どうもです
> CRTPにする
既にあるものの最適化なので、これが適用出来るのか調べてみます

>>953
派生クラスのインスタンスが万単位であった場合は多分変わると思われ…
C++相談室 part115 [転載禁止]©2ch.net
957 :デフォルトの名無しさん[sage]:2015/02/24(火) 17:04:29.73 ID:lOtrXj7U
>>955
少なくとも半分近くは空メソッドです…
C++相談室 part115 [転載禁止]©2ch.net
958 :デフォルトの名無しさん[sage]:2015/02/24(火) 17:08:52.77 ID:lOtrXj7U
>>956
もう実装されてるものの最適化をしています
実測も何も最適化の実装が出来てません><
C++相談室 part115 [転載禁止]©2ch.net
960 :デフォルトの名無しさん[sage]:2015/02/24(火) 17:28:55.57 ID:lOtrXj7U
>>956
仮想関数の呼び出しは激重で空の関数であっても万単位で呼び出すと物凄い事になります…(ミリSecの世界ですが)
取り合えず今手元のPCで計測して確認しても同じでした

>>959
いえ事前に選り分けるので、最適化出来れば完全にコストがゼロになります
C++相談室 part115 [転載禁止]©2ch.net
965 :デフォルトの名無しさん[sage]:2015/02/24(火) 17:53:58.33 ID:lOtrXj7U
要するにゲームなんですよ
空の仮想関数呼び出しでも数万になると1フレーム(16〜32ms)全部使ってしまうよ…(もちろん-O3で)
将来的な事を考えて最適かしておきたかったけど、取り合えず荒れそうなんでこれで失礼します
ありがとうございました
C++相談室 part115 [転載禁止]©2ch.net
967 :デフォルトの名無しさん[sage]:2015/02/24(火) 18:16:21.69 ID:lOtrXj7U
vtblにアクセスできたので自己解決しました (念入りな検証が必要ですが)
C++相談室 part115 [転載禁止]©2ch.net
972 :デフォルトの名無しさん[sage]:2015/02/24(火) 19:22:27.69 ID:lOtrXj7U
>>970
>>965で計測してるよ
こんな単なるループ(と言うほど単純じゃないけど)処理はCPU負荷は数%程度に収めておくべきだけど
逆算すると1000回程度が限界になってしまう (空の仮想関数呼び出しだけでね)
最適化出来たので、数%以内に収める場合は倍の2000ぐらいを最大に出来る (半分が空なんで)

取り合えず派生クラスのソースを一切いじらずに倍の呼び出しが出来るようにはなったよ
(使えるCPU負荷が数%が前提だけど)
C++相談室 part115 [転載禁止]©2ch.net
977 :デフォルトの名無しさん[sage]:2015/02/24(火) 20:42:39.71 ID:lOtrXj7U
>>976
これのマシンスペックってどうなの?かなり速いと思われる
あと同一インスタンスじゃなくて3万位インスタンス作ってみて


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。