我想知道是否在堆栈上创建了变量.考虑以下三个函数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)
在哪些情况下将在堆栈上创建?
通常都是三个,因为b是自动变量.在某些情况下,编译器可能存储b在CPU寄存器中,但您不能强制它发生,这是编译器的选择.
编译器优化级别如何影响此行为?
编译器依赖.
既然你假设你做了一些(有用的)b,它可能不会被优化.如果确实如此,这取决于编译器以及您执行的实际工作b,那么b将不会在堆栈中创建任何内容.
有一个选项更可取吗?
创建b尽可能接近其用法的变量,位于需要它的块的顶部.
我会选择g(),因为它是最简洁的功能(与其他功能相比,它使用最少量的字符来实现相同的目的).而且,它b在使用之前创建.
PS:当然g()只能使用一个return,但你明白了.