内联函数是否将其上下文保留在内联函数中

时间:2019-07-19 12:47:51

标签: c++

如果我创建一个声明为内联的函数,并在另一个函数中使用该函数,则如果该函数是内联的(由于内联对于编译器是可选的,则可能不会发生),该函数会保留其自身的上下文范围吗?

即内联函数的堆栈变量会在插入的内联函数的末尾从堆栈中消失,还是在插入函数后将其从堆栈中删除?

1 个答案:

答案 0 :(得分:3)

堆栈变量是否存在超出其范围不是“可观察到的行为”。即,符合程序无法检测其内存是否仍然存在。因此,在“好像”规则下,编译器可以自由地将内存留给它们,可以将其重用于其他变量,也可以弹出堆栈。您的程序无法分辨,如果您查看生成的机器代码,这三个都可以看到。

即使没有内联,编译器也经常会以不太明显的方式来处理内存。

void f() {
    int a = get_a_value();
    call_a_function(a);
    int b = get_b_value();
    call_another_function(b);
}

在这里,很有可能在进行优化编译时,编译器将为ab使用相同的内存位置。从形式上讲,它们具有相同的生存期,但它们的实际用途并不重叠,因此不需要单独的内存位置。 (而且,是的,编译器也有可能只是将数据填充到寄存器中而不使用内存)。

再次:如果您的程序无法分辨出差异,则编译器可以执行对硬件和操作系统有意义的任何事情。