ページ 11

C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 13:46
by さくらんぼう
具体的なマシンと環境を限定しないで,
C言語コンパイルに関する理論的なお決まりを教えていただきたいのです。
例えば、下記のような二つのケース、実行結果速いのは一般論としてどっちでしょうか。
それとも、速度的には変わりないでしょうかーーー理論上。

// case 1:
int n = a->b->n;
for (int i=0; i<10000; i++) {
double X = n*n*n;
}

// case 2:
for (int i=0; i<10000; i++) {
double X = a->b->n * a->b->n * a->b->n;
}

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 14:07
by softya(ソフト屋)
論理的な決まり事というかこのコードの場合の言語規約上は定められている部分ではありません。マシン語の最適化に関する部分なのでコンパイラと実行CPUに激しく依存します。
ただ、コードを見る限りは最適化されると実行さえしないコンパイラが多そうです。
※ 計算の結果を使っていないので。

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 15:39
by さくらんぼう
有難うございます。

さっきの質問が悪かったんで、申し訳ありませんでした。
単純に言いますと
int m = a->b->n;

int m = n;

より生成したマシンコードは同じかどうかっていう話です。
コンパイルの中間コードが違うかも知れませんが、
結局 「a->b->」の部分がコンパイラに見せるだけの修飾物で、マシンコードでは、
先にaのアドレスを参照して、さらにbの相対アドレスを参照して、さらにnの位置を定めて、nの値をmに転送ではないでしょう。要はこれらの手間はもうコンパイル段階で一発で計算済みでしょうね。

もう一度確認させていただきたいです。

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 16:27
by 初級者
ループを1億回くらい回してみるような
コードを書いて実験してみると、
どちらが早いのか、あるいは同じ早さなのかが
わかるかもしれません。

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 16:55
by YuO
さくらんぼう さんが書きました:単純に言いますと
int m = a->b->n;

int m = n;

より生成したマシンコードは同じかどうかっていう話です。
環境を無視した話に於いて,マシンコードが同じかということを訊ねることに意味はありません。

規格が定義しているのは,「抽象計算機における動作」です。
規格が要求しているのは,「抽象計算機における動作と,結果として同じ動作になること」です。

このため,環境を定義しないでマシンコードの質問をされても,処理系がどういうコードを出力するのかはわからない,ということになります。

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月25日(水) 17:11
by softya(ソフト屋)
コンパイラの最適化がどう働くかはコンパイラ次第ですので、case1とcase2が同じマシン語コードを出力する可能性はあります。
なので、そんなこと気にするより分かりやすいプログラムを書いたほうが良いと言うお決まりの回答なら出来ますけど。

Re: C言語コンパイルに関する理論的なお決まりを知りたい

Posted: 2014年6月27日(金) 16:51
by さくらんぼう
そうですか。
いろいろ有難うございました。