ページ 11

Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 15:21
by 鈴木
お世話になります。

コンパイラー最適化によって、下記のようなコードがどうのように置き換えられるのでしょうか。
double a = offset1 + d[w*x*y*z]; // w,x,y,z皆整数とする。
double b = offset2 + d[w*x*y*z];
double c = offset3 + d[w*x*y*z];

置き換えられた後のコード(等価的)
case1:
int i = w*x*y*z;
double a = offset1 + d;
double b = offset2 + d;
double c = offset3 + d;

case2:
double x = d[w*x*y*z];
double a = offset1 + x;
double b = offset2 + x;
double c = offset3 + x;

宜しくお願い致します。

Re: Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 15:53
by h2so5
そもそもコンパイラの最適化というのはCのコードレベルでの書き換えを行うわけではないので、どのように置き換えられるかというのはC言語では答えようがありません。
それに、offsetやw,x,y,zが定数なのか変数なのか、a, b, c が代入後にどのように利用されるのかといったコンテキストによって最適化の結果が変わりますから、局所的なコードだけでは結果は分かりません。

Re: Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 17:32
by 鈴木
早速お返答有難うございます。
情報不足大変失礼致しました。
w,x,y,xは皆変数です。

case1, case2はコンパイルされたコードの等価的なものを示しております。
要は実行効率を図るためにコンパイラーより修正してくれた算法をC言語風で表わしています。
勿論コンパイル結果として機械コードであることは知っています。

Re: Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 17:47
by h2so5
詳しく知りたいのであれば、実際にアセンブリコードを出力して確認してみてはいかがでしょうか。
読み方が分からない場合、こちらにコードを投稿していただければ解説します。

http://d.hatena.ne.jp/kawatan/20070911

Re: Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 18:27
by 鈴木
お世話になっております。
マシン語本は当に分かりませんが、でもチャレンジしてみたいです。
それ以前に、恥ずかしいながら、
コード実行能率化ためのコンパイルスイッチを教えていただきませんか。
恐らくそのようなスイッチを入れなければ、
前文で示したようなコードの最適化をやってくれないでしょう。
それとも要らないでしょうか。

環境
MS Visual Studio 2013 C++

Re: Visual studio 2013 C++のコンパイラー最適化能力について

Posted: 2014年11月17日(月) 19:13
by h2so5
Releaseモードなら最適化はされますが、個別に設定したいのであれば以下のページが参考になるでしょう。
http://myoga.web.fc2.com/prog/cpp/opti01.htm