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' 的局部变量堆栈大小是否会反映内部范围中定义的大小(即 Locals #1、#2)?

4

2 回答 2

0

可能最好检查生成的程序集。我原以为本地人占用的最坏情况堆栈大小是MAX(sizeof(#1),sizeof(#2)) + sizeof(PassThrough). 虽然取决于优化,但可能会更少。例如,如果PassThrough在第一次使用它之后不是“活”的if,那么它可能只是驻留在寄存器中等等......对于其他变量和寄存器着色也是如此。也许编译器也会进行其他优化......

查看以下内容以查看程序集

如何使用 Visual C++ 查看代码背后的程序集?

我认为通过大会将为您的问题提供最准确的答案:)

于 2013-05-20T08:43:36.370 回答
0

局部变量的堆栈空间和函数执行所需的所有其他内容在编译时保留,因此该空间是否实际需要,即相应的条件评估为真,并不重要(此时实际上并不知道)。编译器通常在函数入口处分配函数堆栈消耗所需的完整内存空间,包括所有局部变量的空间和函数调用的空间,即输入参数、返回地址和返回值。

查看反汇编代码应该会给您相同的答案,您通常会在函数的开头某处发现单个操作将堆栈帧扩展特定数量的字节。在使用 gcc 的 32 位机器上,它类似于sub esp, 32.

于 2015-08-07T06:57:15.340 回答