这是否可以告诉编译器将某个全局变量放入寄存器中?从而有效地阻止了该寄存器在其他任何地方使用。我知道这可能很困难,因为即使是简单的malloc()
电话也需要暂时溢出。
我正在考虑它,因为我正在寻找一种有效地为某种 VM 实现辅助堆栈的方法,自然而然地将辅助堆栈指针存储在另一个寄存器中会很棒。
从理论上讲,这是可能的:您可以获取调用约定需要在函数调用中保留的任何寄存器,并将其用于全局变量。
但是,这存在一些问题:
-
其效果是,您的函数将少一个可用的局部变量寄存器。这意味着平均更多的内存访问。
-
库函数不会保留寄存器值,它们会将其像任何其他非 clobber 寄存器一样保存在堆栈中,随心所欲地使用它,并在返回之前恢复它。
-
因此,不可能将回调指针传递给库函数,并从回调访问寄存器全局。(但无论如何,这可能不是你的问题。
-
如果要将虚拟机堆栈实现为全局变量,则首先会做一些非常错误的事情。堆栈本质上应该是线程本地的,它没有全局业务。
如果做得对,将堆栈指针保留为 VM 模拟器中的局部变量,可能会为您提供最佳性能。
这是否可以告诉编译器将某个全局变量放入寄存器中?
没有。有register
存储类,但这仅意味着变量应该"尽可能快"。这个关键字现在大多已经过时了,它来自编译器是垃圾的时代。
从而有效地阻止了该寄存器在其他任何地方的使用
无法选择特定的寄存器。为此,您必须使用内联汇编程序。
我正在考虑它,因为我正在寻找一种有效地为某种 VM 实现辅助堆栈的方法,自然而然地将辅助堆栈指针存储在另一个寄存器中会很棒。
听起来你需要整体编写汇编程序。甚至无法从 C 设置堆栈指针。或者,如果您所说的"堆栈"不是指程序内存,而是某些数据类型,请不要首先摆弄过早的优化。