ページ 11

コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 19:01
by チルチル
前回の質問で

DATA( 1+(2+4)*((((((4+5))))))-5 );

はコンパイル時に

DATA( 50 );

になると知ったんですが

定数項以外の要素がある式でも、ある程度統合してくれるのでしょうか?

例えば

DATA( 5+3+i );



DATA( 8+i );

見たいな感じで・・

マクロとかを入れても大丈夫でしょうか・・

#define P 9

DATA( 8+P+i );



DATA( 17+i );

みたいに・・

このような事が可能だとしたら

順番は関係あるのでしょうか?

DATA( 2+i+8 );



DATA( 10+i );

とか・・

順番によって変わってくるとしたら

定数項を一纏めにしておいた方が良いって事になりますね・・

あと定数項の式が0になる場合はどうなるんでしょうか?

DATA( 1-1+i );



DATA( 0+i );



DATA( i );

のどっちになるのでしょうか?

質問が長くなってすいません・・

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 19:08
by b
少しは自分で調べてみましょう。

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 19:10
by 御津凪
最近のコンパイラは頭がいいので、最適化できる定数項、マクロは全て最適化できます。

最適化なので、意味のない文も削除されます。

なので、
DATA( 1-1+i );
は、
DATA( i );
になります。

また、
{
    int i = 0;
    i = 1;
    i = 2;
}
は、最適化により {} で囲まれた部分丸ごと省かれます。
(もちろんコンパイラの能力によりますが)

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 19:14
by 御津凪
最適化できる細かい内容は Wikipedia の コンパイラ最適化 に書かれています。

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 19:53
by ねこ
とりあえずですね、本題とは関係ないんですがチルチルさんの気にされている事は

車で進んでる道に蟻が居ないかチェックしながら進む、みたいな事です。

仮に2GHzのCPUで処理していたとして、演算処理なんて数十クロックです。
0.000○ミリ秒の誤差を気にしてる事になります。
物凄い複雑な3D計算でもしない限りCPUによる処理落ちなんてしませんし
そんな事気にするくらいならより良いアルゴリズムを考えた方が100倍マシです。

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 20:10
by チルチル
う~ん最近のコンパイラは高性能ですね・・

よく考えたら確かに気にするほどの事では無かったですね・・

どうもお騒がせしました。

Re:コンパイル時の定数項 その2

Posted: 2009年6月15日(月) 22:15
by たかぎ
定数式かどうかについては効率以外の問題もあるので、きちんと理解していることは無意味ではありません。
それに対して、定数式ではなく、式に変数等が混在する場合は、コンパイル結果の確認を行うときなどを除けば、まず気にすることは無いでしょう。

ちなみに、定数式かどうかについては、列挙子の値、caseラベル、配列の要素数、テンプレート実引数等に使えるかどうかに関わってきます。