内联函数是否在内联函数中保留其上下文
Do inline functions retain their context within the function they are inlined within
如果我创建一个声明为内联的函数,并在另一个函数中使用它,如果该函数是内联的(这可能不会发生,因为内联对于编译器来说是可选的),该函数会保留它自己的上下文范围吗?
即,内联函数的堆栈变量会在插入的内联函数结束时从堆栈中消失,还是在它插入的函数从堆栈中删除之后?
堆栈变量是否存在在其范围之外不是"可观察的行为"。也就是说,符合标准的程序无法检测其内存是否仍然存在。因此,在"好像"规则下,编译器可以自由地离开内存,将其重用于其他变量,或弹出堆栈。你的程序无法分辨,如果你看一下生成的机器代码,这三个都可以看到。
即使没有内联,编译器也经常会以可能不明显的方式处理内存。
void f() {
int a = get_a_value();
call_a_function(a);
int b = get_b_value();
call_another_function(b);
}
在这里,当您使用优化进行编译时,编译器很可能会使用相同的内存位置进行a
和b
。从形式上讲,它们具有相同的生存期,但它们的实际用途不会重叠,因此不需要单独的内存位置。(而且,是的,编译器也可能只是将数据填充到寄存器中,而不是使用内存)。
再说一遍:如果你的程序无法分辨出区别,编译器可以做任何对硬件和操作系统有意义的事情。
相关文章:
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- 如何在 v8 Javascript 中的多个函数中使用相同的上下文?
- 我的一些 D3D11 对象在调用某些设备上下文函数时将自身作为 ComPtrs 为空
- 实现上下文切换 - 第二个函数不再运行
- 内联函数是否在内联函数中保留其上下文
- 加载的 OpenGL 函数是特定于上下文还是特定于线程?(视窗)
- 如何在未评估的上下文中将成员函数的结果类型应用于类成员
- 在spirit parser Action中,在上下文参数上编译boost :: bind(成员函数)上的错误
- SDL2要么丢失OpenGL上下文或未定义的函数
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 如何修复C#应用程序中调用C++DLL函数时的上下文加载错误
- 如何将C++lambda传递给需要函数指针和上下文的C回调
- 为什么从 DLL 调用 boost::wave::上下文构造函数时会死锁
- 没有上下文类型信息的重载函数 |无法根据转换为类型 'int' 解析重载函数'swap'
- C++类方法,可以使用虚拟调度或类似于没有对象上下文的静态函数来调用
- QTableWidget-QMenu上下文菜单-AddAction插槽不调用函数
- Windows GDI上下文-函数失败,GetLastError()返回0
- C++内联函数和上下文特定优化
- 根据调用方/上下文专门化函数的行为