具体的なマシンと環境を限定しないで,
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;
}
C言語コンパイルに関する理論的なお決まりを知りたい
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C言語コンパイルに関する理論的なお決まりを知りたい
論理的な決まり事というかこのコードの場合の言語規約上は定められている部分ではありません。マシン語の最適化に関する部分なのでコンパイラと実行CPUに激しく依存します。
ただ、コードを見る限りは最適化されると実行さえしないコンパイラが多そうです。
※ 計算の結果を使っていないので。
ただ、コードを見る限りは最適化されると実行さえしないコンパイラが多そうです。
※ 計算の結果を使っていないので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C言語コンパイルに関する理論的なお決まりを知りたい
有難うございます。
さっきの質問が悪かったんで、申し訳ありませんでした。
単純に言いますと
int m = a->b->n;
と
int m = n;
より生成したマシンコードは同じかどうかっていう話です。
コンパイルの中間コードが違うかも知れませんが、
結局 「a->b->」の部分がコンパイラに見せるだけの修飾物で、マシンコードでは、
先にaのアドレスを参照して、さらにbの相対アドレスを参照して、さらにnの位置を定めて、nの値をmに転送ではないでしょう。要はこれらの手間はもうコンパイル段階で一発で計算済みでしょうね。
もう一度確認させていただきたいです。
さっきの質問が悪かったんで、申し訳ありませんでした。
単純に言いますと
int m = a->b->n;
と
int m = n;
より生成したマシンコードは同じかどうかっていう話です。
コンパイルの中間コードが違うかも知れませんが、
結局 「a->b->」の部分がコンパイラに見せるだけの修飾物で、マシンコードでは、
先にaのアドレスを参照して、さらにbの相対アドレスを参照して、さらにnの位置を定めて、nの値をmに転送ではないでしょう。要はこれらの手間はもうコンパイル段階で一発で計算済みでしょうね。
もう一度確認させていただきたいです。
Re: C言語コンパイルに関する理論的なお決まりを知りたい
ループを1億回くらい回してみるような
コードを書いて実験してみると、
どちらが早いのか、あるいは同じ早さなのかが
わかるかもしれません。
コードを書いて実験してみると、
どちらが早いのか、あるいは同じ早さなのかが
わかるかもしれません。
Re: C言語コンパイルに関する理論的なお決まりを知りたい
環境を無視した話に於いて,マシンコードが同じかということを訊ねることに意味はありません。さくらんぼう さんが書きました:単純に言いますと
int m = a->b->n;
と
int m = n;
より生成したマシンコードは同じかどうかっていう話です。
規格が定義しているのは,「抽象計算機における動作」です。
規格が要求しているのは,「抽象計算機における動作と,結果として同じ動作になること」です。
このため,環境を定義しないでマシンコードの質問をされても,処理系がどういうコードを出力するのかはわからない,ということになります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C言語コンパイルに関する理論的なお決まりを知りたい
コンパイラの最適化がどう働くかはコンパイラ次第ですので、case1とcase2が同じマシン語コードを出力する可能性はあります。
なので、そんなこと気にするより分かりやすいプログラムを書いたほうが良いと言うお決まりの回答なら出来ますけど。
なので、そんなこと気にするより分かりやすいプログラムを書いたほうが良いと言うお決まりの回答なら出来ますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。