我目前正在阅读“编程:使用C ++的原理和实践”,作者提到在类定义中编写成员函数的定义可以使函数内联。我不确定这意味着什么,因此我查看了https://www.geeksforgeeks.org/inline-functions-cpp/以获得更具体的理解。在这句话的上下文中,我似乎无法理解“指令”的含义:
程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址。
我用谷歌搜索,看起来呼叫指令只是将控制权传递给程序的另一部分或另一个应用程序。如果这就是他们的意思,那么他们是否应该说“ CPU存储函数调用的调用指令的内存地址”?
这个问题听起来有些怪异或挑剔,但我是CS的新手,所以我真的想对CS有深刻的了解。
答案 0 :(得分:3)
实际上,它们的确意味着存储了函数调用之后的指令的存储器地址。这是因为指令在机器代码级别上的工作方式。函数调用完成后,程序需要一种返回到原来位置的方法。它通过跳转指令到存储的存储器地址来执行此操作,从而导致执行跳转到该指令。如果内存地址指向函数调用,它将永远循环。
答案 1 :(得分:1)
首先,您链接到的页面正在讨论特定类系统上的行为。它不是在描述标准C ++。
该页面讨论的是C ++编译器可能生成的汇编语言。 “功能调用指令”是指执行功能调用的汇编语言(或机器代码)指令。在x86语法中,该指令为call
。 Example。
您可以通过搜索“ x86调用说明”或类似术语来查找有关此信息的更多信息。
要存储的地址(通常称为返回地址)是call
之后的下一条指令的地址。当函数的执行到达ret
汇编指令时,执行将跳转到返回地址。
答案 2 :(得分:1)
不,这是说的(这是x86芯片所特有的,其他人可能会有所不同)是CPU在调用之后将指令的地址存储在堆栈顶部,然后跳转到该地址这是调用指令的操作数。当被调用函数执行“ ret”指令时,将读取存储的地址,然后执行跳转到该点。
答案 3 :(得分:1)
执行x86 CALL指令时,程序计数器的内容(即指令其后 CALL的地址)存储在堆栈中,并且程序控制权转移到子例程。
(x86的程序计数器寄存器(IP / EIP / RIP)isn't normally directly accessible,但它被定义为在当前指令执行时指向下一条指令。)
完成子例程后,将执行RET指令,该指令将堆栈内容(即CALL指令后的指令地址)加载回程序计数器。
因此,call