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

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

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

#1

投稿記事 by さくらんぼう » 6年前

具体的なマシンと環境を限定しないで,
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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 6年前

論理的な決まり事というかこのコードの場合の言語規約上は定められている部分ではありません。マシン語の最適化に関する部分なのでコンパイラと実行CPUに激しく依存します。
ただ、コードを見る限りは最適化されると実行さえしないコンパイラが多そうです。
※ 計算の結果を使っていないので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

さくらんぼう

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

#3

投稿記事 by さくらんぼう » 6年前

有難うございます。

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

int m = n;

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

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

初級者
記事: 200
登録日時: 9年前

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

#4

投稿記事 by 初級者 » 6年前

ループを1億回くらい回してみるような
コードを書いて実験してみると、
どちらが早いのか、あるいは同じ早さなのかが
わかるかもしれません。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#5

投稿記事 by YuO » 6年前

さくらんぼう さんが書きました:単純に言いますと
int m = a->b->n;

int m = n;

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 6年前

コンパイラの最適化がどう働くかはコンパイラ次第ですので、case1とcase2が同じマシン語コードを出力する可能性はあります。
なので、そんなこと気にするより分かりやすいプログラムを書いたほうが良いと言うお決まりの回答なら出来ますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

さくらんぼう

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

#7

投稿記事 by さくらんぼう » 6年前

そうですか。
いろいろ有難うございました。

閉鎖

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