我在驱动程序中有以下功能:
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)?
答案 0 :(得分:0)
可能最好检查生成的装配。我原以为本地人占用的最坏情况下的堆栈大小是MAX(sizeof(#1),sizeof(#2)) + sizeof(PassThrough)
。可能会更少,但取决于优化。例如,如果PassThrough
在第一个if
之后不是“实时”,那么它可能只是驻留在寄存器等中......对于其他变量和寄存器着色也是如此。也许编译器也做了其他优化......
请参阅以下内容以查看程序集
How to view the assembly behind the code using Visual C++?
我认为通过大会将为您提供最准确的答案:)
答案 1 :(得分:0)
本地变量的堆栈空间和函数执行所需的其他所有内容都在编译时保留,因此无论这个空间是否真正需要,即相应的条件评估为真,都无关紧要(实际上并不知道点)。 编译器通常在函数入口处分配函数堆栈消耗所需的完整内存空间,包括所有局部变量的空间和函数调用的空间,即输入参数,返回地址和返回值。
查看反汇编代码应该给出相同的答案,您通常会在函数的最开头找到一个操作,将堆栈帧扩展一个特定的字节数。在使用gcc的32位机器上,它将类似于sub esp, 32
。