当调用new函数时,返回地址值发生了什么?
What happens with return address value when new function is called
想象一下下面的代码
int main()
{
f();
}
void f() { g(); }
void g() { cout << "hello" << endl; }
当f被调用时,在RA(返回地址)寄存器中存储了main中调用f的地址(f知道结束时跳转到哪里)。当f调用g时,它应该将RA设置为f中的地址,以便知道返回的位置。那么这是如何做到的呢?它是否将RA存储在临时位置或其他地方,而不是覆盖旧值?
谢谢。
在没有任何优化的情况下,您的示例中的通常过程:
- main() -在栈上推送返回地址,调用f()。
- f():推送返回地址,调用g()。
- g():打印,然后弹出返回地址并移动到程序计数器登记。
- f():弹出返回地址,进入程序计数器
- main():结束程序。
这是理论。编译器可能会发出不同的代码。
编辑1:
要了解确切的细节,请告诉编译器打印汇编语言。
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- libstdc++的make_shared布局在gcc 4.x和gcc 6.x之间是否发生了变化?
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 为什么我的 int 在 C++ 程序中间发生了变化?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 在使用VS2010构建ACE和TAO(CORBA)时发生了许多错误
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 让对象知道它创建的 show 函数中发生了什么
- 从arm程序集调用c函数时,堆地址发生了移位
- 当调用new函数时,返回地址值发生了什么?