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

Do inline functions retain their context within the function they are inlined within

本文关键字:函数 上下文 保留 是否      更新时间:2023-10-16

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

即,内联函数的堆栈变量会在插入的内联函数结束时从堆栈中消失,还是在它插入的函数从堆栈中删除之后?

堆栈变量是否存在在其范围之外不是"可观察的行为"。也就是说,符合标准的程序无法检测其内存是否仍然存在。因此,在"好像"规则下,编译器可以自由地离开内存,将其重用于其他变量,或弹出堆栈。你的程序无法分辨,如果你看一下生成的机器代码,这三个都可以看到。

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

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

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

再说一遍:如果你的程序无法分辨出区别,编译器可以做任何对硬件和操作系统有意义的事情。