0

私はドライバーで以下の機能を持っています:

function MyFilter( )
{
    bool PassThrough = true;

    if ( <some condition> )
    { 
         PassThrough = false;
    }  

    if ( PassThrough )
    {
        // some local stack variables  //Locals #1
        IofCallDriver( );
    }
    else 
    {
        // more local stack variables  //Locals #2
        NonPassThroughWork( );
    }
}

私のクエリ:

上記のドライバー関数を (MSFT C++ コンパイラーを使用して) コンパイルした場合、ローカル変数によるスタック消費はどのくらいになりますか? 'MyFilter' のローカル変数スタック サイズは、内部スコープ (つまり、ローカル #1、#2) で定義されたサイズを反映しますか?

4

2 に答える 2

0

ローカル変数と関数の実行に必要なその他すべてのスタック領域はコンパイル時に予約されるため、この領域が実際に必要かどうか、つまり、それぞれの条件が true と評価されるかどうかは問題ではありません (その時点では実際にはわかりません)。コンパイラは通常、すべてのローカル変数用のスペースと関数呼び出し用のスペース、つまり入力引数、戻りアドレス、戻り値など、関数のスタック消費に必要な完全なメモリ スペースを関数エントリで割り当てます。

逆アセンブルされたコードを見ると、同じ答えが得られるはずです。通常、関数の最初のどこかで、特定のバイト数だけスタック フレームを拡張する単一の操作を見つけることができます。gcc を使用する 32 ビット マシンでは、次のようになりますsub esp, 32

于 2015-08-07T06:57:15.340 に答える