0

私の問題を非常に単純化した形式で述べます。これは次のとおりです。

Cと入力すると

void main(){
 int a=3+2;
 double b=7/2;
}

a と b に 5 と 3.5 の値が割り当てられるのは、コードをコンパイルするときですか、それともコードを実行するときですか?

つまり、コンパイルを押すとどうなりますか? そして、値の割り当てと計算の実行に関して、実行を押した場合とどのように異なり、次のようにコードを記述することとどのように異なるのですか。

void main(){
 int a=5;
 double b=3.5;
}

コンパイラの最適化について聞いたことがありますが、それは私の分野ではありません。

コメント、レビューは大歓迎です。ありがとうございました。

4

5 に答える 5

7

あなたは「コードの最適化」について尋ねているので、優れた最適化コンパイラはこのコードをvoid main(){}. aそしてb完全に解消されます。

また、7/2 == 33.5 ではありません

于 2013-10-26T03:00:56.633 に答える
2

コンパイルは、高水準言語をアセンブリなどの下位言語に変換します。優れたコンパイラは最適化する場合があり、これはカスタマイズ可能 (たとえば-O2) オプションなどです。

あなたのコードに関しては、整数と整数演算を行うため、代わりにdouble b=7/2;が生成されます。を持ちたい場合は、 のようにする必要があります。これは、人々が犯す非常に一般的な間違いです。3.03.53.5double b=7.0/2.0;

于 2013-10-26T03:02:06.277 に答える
1

これはコンパイラに依存します。良いものはCFおよび/またはDCEを実行します。

于 2013-10-26T02:59:31.933 に答える
1

コンパイルを押すとどうなりますか?

誰も知らない。コンパイラはそれを定数に最適化する場合としない場合があります。おそらくそうなるでしょうが、そうする必要はありません。

コンパイラの最適化を絶対に必要とする立場にある場合を除き、一般的にはコンパイラの最適化について心配したり、実際に考えたりする必要はありません。コンパイラは通常、ユーザーよりも優れた仕事をすることができます。

于 2013-10-26T03:01:53.403 に答える
1

最適化についても何も知りませんが、これを試してみることにしました。を使用しgcc -c -S test.cて、関数のアセンブリを取得しました。int a = 3 + 2出てくる線はこんな感じ。

movl    $5, -4(%rbp)

したがって、私にとっては、コンパイル時に値 (3+2) を 5 に変換していますが、コンパイラとプラットフォーム、および渡すフラグに依存します。

a(また、コードを完全に最適化しないように、関数を returnにしました。)

于 2013-10-26T03:09:45.027 に答える