コンパイル時の定数項?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
チルチル

コンパイル時の定数項?

#1

投稿記事 by チルチル » 16年前

DXライブラリを使ったプログラムを製作中なのですが
定数項について質問があります

極端な例ですが

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

のように、関数を呼び出した時に定数項だけで引数を渡した場合
コンパイル時に

DATA(50);

のように1つの数値にまとめられていたりするのでしょうか?

まとめられていれば良いのですが
そうでない場合はできるだけ余計な計算が引数に入らないように気を付けないと
関数を呼び出すたびに無駄な処理が行われてしまうので
コンパイル時にどうなっているのか教えてください

kazuoni

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

#2

投稿記事 by kazuoni » 16年前

式を評価した値を関数の引数として値渡ししているので、
実行前の段階に50という数字は出てないと思います。

>関数を呼び出すたびに無駄な処理が行われてしまうので
代入した値を引数として用いれば解決できるはずです。

#また知識不足の発言でした・・・

たいちう

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

#3

投稿記事 by たいちう » 16年前

コンパイラによるのか規格で保証されているのか知りませんが、
普通のコンパイラならまとめるでしょう。
例えばVC2008では、次のように確認できます。
int main()
{
00411500  push        ebp  
00411501  mov         ebp,esp 
00411503  sub         esp,0CCh 
00411509  push        ebx  
0041150A  push        esi  
0041150B  push        edi  
0041150C  lea         edi,[ebp-0CCh] 
00411512  mov         ecx,33h 
00411517  mov         eax,0CCCCCCCCh 
0041151C  rep stos    dword ptr es:[edi] 
	int v = Data(1+(2+4)*((((((4+5))))))-5);
0041151E  push        32h  
00411520  call        Data (4111B8h) 
00411525  add         esp,4 
00411528  mov         dword ptr [v],eax 
	cout << v << endl;
0041152B  mov         esi,esp 
...
他のスレでも指摘している人がいましたが、質問を乱発しすぎだと思います。
ここでは掲示板のマナー云々の話はしませんが、問題を1つ1つ解決しようという
集中力に欠けているような印象を受けます。
同時に多くの問題をかかえ、多くのスレを立てることで、
1つ1つの回答者の指摘を消化できていないようです。

誰が一番損していると思いますか?

たかぎ

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

#4

投稿記事 by たかぎ » 16年前

> DATA(50);
> のように1つの数値にまとめられていたりするのでしょうか?

定数式ですので、コンパイル時に計算されます。

チルチル

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

#5

投稿記事 by チルチル » 16年前

なるほど、やはり計算されているんですか

>>他のスレでも指摘している人がいましたが、質問を乱発しすぎだと思います

すいません、当面の問題は全部解決したのでしばらく大人しくしています

どうもありがとうございました

toyo

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

#6

投稿記事 by toyo » 16年前

コンパイラによってはmath関数の結果もコンパイル前に計算されたりします
例えば平方根を求める
sqrt(2.0)
も関数呼び出しではなく1.414...に置き換えられる場合があります

たかぎ

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

#7

投稿記事 by たかぎ » 16年前

sqrtをコンパイル時に計算してしまうのは、組み込み関数による最適化ですね。
文法上は定数式にならないので、やや扱いが異なります。

ちなみに、私は最近変な実験を行っていて...
const double SQRT2 = <?php echo sqrt(2.0); ?>;
のように、PHPを前処理に使って静的にできることを増やす検討をしています。
# 遊びの範疇を超えませんが...

テンプレートでは浮動小数点数を扱えませんが、PHPなら簡単に埋め込めるので期待しています。
あるいは、整列済みの配列や木構造を静的に作れるのも魅力です。

閉鎖

“C言語何でも質問掲示板” へ戻る