VC++のデバッグビルドで動作するコードがリリースビルドで動作しない件

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

タイトルとURLをコピーしました