前回の質問で
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 );
のどっちになるのでしょうか?
質問が長くなってすいません・・
コンパイル時の定数項 その2
Re:コンパイル時の定数項 その2
最近のコンパイラは頭がいいので、最適化できる定数項、マクロは全て最適化できます。
最適化なので、意味のない文も削除されます。
なので、
DATA( 1-1+i );
は、
DATA( i );
になります。
また、
(もちろんコンパイラの能力によりますが)
最適化なので、意味のない文も削除されます。
なので、
DATA( 1-1+i );
は、
DATA( i );
になります。
また、
{ int i = 0; i = 1; i = 2; }は、最適化により {} で囲まれた部分丸ごと省かれます。
(もちろんコンパイラの能力によりますが)
Re:コンパイル時の定数項 その2
とりあえずですね、本題とは関係ないんですがチルチルさんの気にされている事は
車で進んでる道に蟻が居ないかチェックしながら進む、みたいな事です。
仮に2GHzのCPUで処理していたとして、演算処理なんて数十クロックです。
0.000○ミリ秒の誤差を気にしてる事になります。
物凄い複雑な3D計算でもしない限りCPUによる処理落ちなんてしませんし
そんな事気にするくらいならより良いアルゴリズムを考えた方が100倍マシです。
車で進んでる道に蟻が居ないかチェックしながら進む、みたいな事です。
仮に2GHzのCPUで処理していたとして、演算処理なんて数十クロックです。
0.000○ミリ秒の誤差を気にしてる事になります。
物凄い複雑な3D計算でもしない限りCPUによる処理落ちなんてしませんし
そんな事気にするくらいならより良いアルゴリズムを考えた方が100倍マシです。
Re:コンパイル時の定数項 その2
定数式かどうかについては効率以外の問題もあるので、きちんと理解していることは無意味ではありません。
それに対して、定数式ではなく、式に変数等が混在する場合は、コンパイル結果の確認を行うときなどを除けば、まず気にすることは無いでしょう。
ちなみに、定数式かどうかについては、列挙子の値、caseラベル、配列の要素数、テンプレート実引数等に使えるかどうかに関わってきます。
それに対して、定数式ではなく、式に変数等が混在する場合は、コンパイル結果の確認を行うときなどを除けば、まず気にすることは無いでしょう。
ちなみに、定数式かどうかについては、列挙子の値、caseラベル、配列の要素数、テンプレート実引数等に使えるかどうかに関わってきます。