0

intをfloatにキャストする(およびその逆)のはかなり費用がかかることを私は知っています。ただし、コンパイラは、コード内の定数に対してコンパイル時に自動的にそれを実行しますか?たとえば、間に違いはありますか

float y = 123;
float x = 1 / y;

float y = 123.f;
float x = 1.f / y;

後者を実行するコードがいくつかありますが、それが最適化のためか安全性の問題かはわかりません(つまり、yがintであっても、除算が浮動小数点であることを確認するだけです)。

私はgccを使用しています(答えはコンパイラ固有である可能性があるため)。

また、コンパイラが一般的に最適化できるものとできないもののリストへのポインタをいただければ幸いです。ありがとう!

4

4 に答える 4

2

はい、コンパイラは自動的に変換を行います。2つのコードブロックは同じです。

最適化ではありません。最適化をオフにしても、非常に低品質の実装でない限り、コンパイラは実行可能コードにintからfloatへの変換を含めません。

安全のためでもありません。コンパイラは、オペランドがたまたま異なるタイプである場合に備えて、何も実行しません。コンパイラは、コード内のすべてのタイプを認識しています。変数のタイプを変更すると、その変数を使用するすべてのものがとにかく再コンパイルされます。コンパイラーは、他のすべてを変更せずに、変更されたセクションを更新しようとはしません。

于 2009-09-14T06:36:08.670 に答える
0

はい、確かにそうなので、2つのスニペットは同等です。重要なのは、割り当てる変数のタイプだけです。

于 2009-09-14T06:35:47.893 に答える
0

float y=123floaty= 123.fの場合は、ほとんどのコンパイラで同じですが、 yが整数の場合、 float x = 1/yとfloatx = 1.f/yは実際には異なる結果を生成します。

それは実際にはコンパイラに依存します-実際には定数intを格納し、float変数に割り当てられるたびに変換する場合があります。

于 2009-09-14T06:40:12.047 に答える
0

コンパイラがfloatをintにキャストする場合があります。

float f;
if (f > 1) ...

この場合、コンパイラが次のコードと同等のコードを生成することがありました(Visual Studio 2008)。

if (int (f) > 1) ...
于 2009-09-14T11:59:43.900 に答える