VC++で、デバッグ構成でビルドしたプログラムでは動作するコードが
リリース構成でビルドすると動かないよ?ということが稀にある。
これはVC++の最適化によるものかもしれない。
例えば、次のコード。
void func() {
int a;
a = 100;
}
この関数内の変数 a に値が代入されているが、
この値は全く使用されていない。
このとき、コンパイラはこの代入文をなかったものとして扱う。
つまり、上記関数は
void func() {
}
(何も処理なし)
と同じってこと。
この場合は当然そうだけど、
例えばSという構造体にaというメンバがあるとして、
この値がfunc2という関数にポインタ渡しして使用する場合
void func() {
S _s;
_s.a = 100;
func2(&_s);
}
となるけど、この場合も最適化によって、
_s.a に代入された値は使用されていないとみなされて
void func() {
S _s;
func2(&_s);
}
(_s.a = 100 という行がなかったことになる)
と同じ処理になってしまう(ことがある!)
こういうのを避けたい場合、
あえて最適化させないプラグマを埋め込む。
#pragma optimize(“”, off)
(ここに最適化させたくないコード)
#pragma optimize(“”, on)
こうすると コンパイルで C4748 警告が出るけど、
当該コードがバッファオーバーランしないことが確実なら無視すれば良い。
参考: [MSDN] コードの最適化
http://msdn.microsoft.com/ja-jp/library/xz7ttk5s%28v=vs.80%29.aspx