2012.02.29 Wednesday
コンパイラによる最適化
コンパイラによる最適化で思ったようにクラック出来なかった原因を探るため、
次のようなコードを書いてみた。
#include <stdio.h>
#include <string.h>
int main()
{
int i = 256;
int j = 1024;
return 0;
}
VC++でコンパイルし、出力されたアセンブリコードを見てみる。
最初は最適化オプションオフ。
教科書どおりだ。
次に最適化オン。
i=256などとしても以後使用されないので領域確保しても無駄である。
なので変数の代入はおろか、領域確保さえ行われない。
昨日書いたコードが最適化によってうまく動かなかったのはこういう事情があったようだ。
コンパイル時点で変数の要不要が判断できないようなプログラムを書けばいいかな、と思ったがそれだけではだめなようだ。
ローカル変数の格納場所が教科書どおりではないかも。
ゆっくり読み解かないと。
次のようなコードを書いてみた。
#include <stdio.h>
#include <string.h>
int main()
{
int i = 256;
int j = 1024;
return 0;
}
VC++でコンパイルし、出力されたアセンブリコードを見てみる。
最初は最適化オプションオフ。
教科書どおりだ。
次に最適化オン。
i=256などとしても以後使用されないので領域確保しても無駄である。
なので変数の代入はおろか、領域確保さえ行われない。
昨日書いたコードが最適化によってうまく動かなかったのはこういう事情があったようだ。
コンパイル時点で変数の要不要が判断できないようなプログラムを書けばいいかな、と思ったがそれだけではだめなようだ。
ローカル変数の格納場所が教科書どおりではないかも。
ゆっくり読み解かないと。