寄存器中的全局变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寄存器中的全局变量相关的知识,希望对你有一定的参考价值。

这是否可以告诉编译器将某个全局变量放入寄存器?从而有效地阻止该寄存器在其他地方使用。我知道这可能很难,因为即使只是简单地调用malloc()也需要暂时将其泄漏。

我正在考虑它,因为我正在寻找一种方法来有效地为各种VM实现二级堆栈,自然将二级堆栈指针存储在另一个寄存器中会很棒。

答案

从理论上讲,这是可能的:您可以使用调用约定所需的任何寄存器来跨函数调用保留,并将其用于全局变量。

但是,这有一些问题:

  • 结果是,您的函数将减少一个可用的局部变量寄存器。这意味着平均更多的内存访问。
  • 库函数不会保留寄存器值,它们会像任何其他非clobber寄存器一样将它保存在堆栈中,随意使用它,并在它们返回之前将其恢复。
  • 因此,不可能将回调指针传递给库函数,并从回调访问寄存器全局。 (但这可能不是你的问题。)
  • 如果您将VM堆栈实现为全局变量,那么您首先要做的事情非常糟糕。堆栈本质上应该是线程本地的,它没有业务是全局的。

正确地做,将堆栈指针保持为VM模拟器中的本地变量可能会为您提供最佳性能。

另一答案

这是否可以告诉编译器将某个全局变量放入寄存器?

并不是的。有register存储类,但这只意味着变量应该“尽可能快”。这个关键字现在大多已经过时,它是从编译器是垃圾的时候开始的。

从而有效地阻止该寄存器在其他地方使用

无法选择特定的寄存器。您必须使用内联汇编程序。

我正在考虑它,因为我正在寻找一种方法来有效地为各种VM实现二级堆栈,自然将二级堆栈指针存储在另一个寄存器中会很棒。

听起来你需要整体编写汇编程序。甚至不可能从C设置堆栈指针。或者如果通过“堆栈”你并不是指程序存储器,而是一些数据类型,那么首先不要使用预先成熟的优化。

以上是关于寄存器中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

全局变量比C中的局部变量快吗? [关闭]

程序并发操作中,解决数据同步的四种方法

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

c提高

php中的全局变量引用