何时为局部变量分配堆栈空间?

Nea*_*len 11 c stack memory-management

我对以下C代码有疑问:

void my_function()
{
    int i1;
    int j1;

    // Do something...

    if (check_something())
    {
        int i2;
        int j2;

        // Do something else...
    }

    // Do some more stuff...
}
Run Code Online (Sandbox Code Playgroud)

是否有关于何时为i2和j2分配/解除分配堆栈空间或是否依赖于编译器的保证?我希望当i2和j2进入范围时调整堆栈指针,并在它们超出范围时进行调整,但后来认为某些编译器可能只是"优化"整个事物并在嵌套范围内考虑变量.首先输入该功能.

我知道我可以查看我的编译器生成的汇编代码,但是想知道实现是否可以留给编译器.

谢谢!

pmg*_*pmg 8

没有保证.

不同的优化标志可能会导致保存变量的不同方法.

编译器甚至可以使一个或多个变量完全不使用堆栈,并在函数执行的整个持续时间内将它们保存在寄存器中.


Ara*_*raK 6

只要保留语言的语义,编译器就可以随意做任何事情.换句话说,并且可以在执行到达其块的入口点之前绑定到内存位置,并且可以在任何时间无限制,只要这不会影响代码的语义.i2j2