这是否可以告诉编译器将某个全局变量放入寄存器?从而有效地阻止该寄存器在其他地方使用。我理解这可能很难,因为即使是对malloc()
的简单调用也需要暂时将其溢出。
我正在考虑它,因为我正在寻找一种方法来有效地为某种VM实现辅助堆栈,并且将辅助堆栈指针存储在另一个寄存器中自然会很棒。
答案 0 :(得分:2)
理论上,这是可能的:您可以使用任何调用约定所需的寄存器,并将其用于全局变量。
然而,这有一些问题:
结果是,您的函数将减少一个可用的局部变量的寄存器。这意味着平均更多的内存访问。
库函数不保存寄存器值,它们会像任何其他非clobber寄存器一样将它保存在堆栈中,随意使用它,并在它们返回之前恢复它。
因此,不可能将回调指针传递给库函数,并从回调访问寄存器全局。 (但这可能不是你的问题。)
如果您正在将VM堆栈实现为全局变量,那么您首先要做的事情非常糟糕。堆栈本质上应该是线程本地的,它没有业务是全局的。
正确地做,将堆栈指针保持为VM模拟器中的本地变量可能会为您提供最佳性能。
答案 1 :(得分:1)
这是否可以告诉编译器将某个全局变量放入寄存器?
不是真的。有register
存储类,但这只意味着变量应该“尽可能快”。这个关键词现在已经过时了,它来自于编译器是垃圾的时候。
因此有效地阻止该寄存器在其他地方使用
无法选择特定的寄存器。你必须使用内联汇编程序。
我正在考虑它,因为我正在寻找一种方法来有效地为某种VM实现辅助堆栈,并且将辅助堆栈指针存储在另一个寄存器中自然会很棒。
听起来你需要整体编写汇编程序。甚至不可能从C设置堆栈指针。或者如果通过“堆栈”你不是指程序存储器,而是一些数据类型,那么首先不要使用预先成熟的优化。 / p>