C中堆栈的变量创建

oli*_*fhg 2 c stack function

我想知道是否在堆栈上创建了变量.考虑以下三个函数f,g和h以及变量b:

void f(int a) {
    int b;
    if (a == 0) {
        return;
    }
    // do sth with b;
    return;
}

void g(int a) {
    if (a == 0) {
        return;
    }
    int b;
    // do sth with b;
    return;
}

void h(int a) {
    if (a == 0) {
        return;
    } else {
        int b;
        // do sth with b;
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在哪些情况下将在堆栈上创建?
  2. 编译器优化级别如何影响此行为?
  3. 有一个选项更可取吗?

gsa*_*ras 5

在哪些情况下将在堆栈上创建?

通常都是三个,因为b是自动变量.在某些情况下,编译器可能存储b在CPU寄存器中,但您不能强制它发生,这是编译器的选择.

编译器优化级别如何影响此行为?

编译器依赖.

既然你假设你做了一些(有用的)b,它可能不会被优化.如果确实如此,这取决于编译器以及您执行的实际工作b,那么b将不会在堆栈中创建任何内容.

有一个选项更可取吗?

创建b尽可能接近其用法的变量,位于需要它的块的顶部.

我会选择g(),因为它是最简洁的功能(与其他功能相比,它使用最少量的字符来实现相同的目的).而且,它b在使用之前创建.

PS:当然g()只能使用一个return,但你明白了.

  • 即使有用的东西,它仍然可以被优化 (3认同)
  • "_Create变量b尽可能接近其用法._"这是个人问题.我更喜欢让它们"尽可能接近",但是在需要它的地方的顶部.这样可以更容易地找到变量声明的位置. (2认同)