我在课堂上遇到了问题。问题是在C中,调用函数负责从被调用者返回后从堆栈中删除参数,而不是Pascal,其中被调用者负责从堆栈中删除参数。问题是Pascal删除参数的方式比C更有效,我们被问到为什么会这样。我们得到了线索 - 考虑从函数返回的机器命令。所以我想 - 据我所知,在汇编中你可以将堆栈指针更改为指向插入堆栈的第一个参数以准备函数激活。所以如果是这样的话,C和Pascal都不会更有效率。是吗?
答案 0 :(得分:1)
他们试图得到的可能是x86有一个专门的RET x
指令,它返回时还会从堆栈中删除x
个字节的参数。显然,这在其他体系结构上可能会有所不同,即使调用约定也可能不同。
请注意,如果你的函数使用局部变量,你可以将函数参数折叠到它们中,这样使用C调用约定就可以达到相同的速度,如果不是更快的话。