この記事は3年以上前に書かれた記事です。情報が古い可能性があります。
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