7

在 C 中,我可以为变量分配寄存器,例如:

register int i = 0;

我知道 Java 是一种解释性语言,并且与 CPU 有许多抽象。

是否有任何机制可用于请求(如果架构不允许,那又怎样)我的变量保留在寄存器中而不是移动到缓存或主内存?

我不认为有什么办法,但我之前一直很惊喜。

谢谢,

4

6 回答 6

18

register在 C 中没有将变量注册。它只是给编译器一个提示,将它放入寄存器可能会很好。

在 Java 中没有等价物。

于 2009-02-11T21:00:33.090 回答
6

如果它在很短的空间内使用得足够多,使其成为寄存器 int 是值得的,那么热点编译器应该能够自己解决这个问题。

事实上,热点编译器应该能够比 C/C++ 编译器做得更好,因为它有更多的信息可以使用。C/C++ 编译器必须猜测;HotSpot 可以测量。

于 2009-02-11T21:00:51.967 回答
5

Java 中没有等价物。即使在 C 语言中,也不能保证变量会存储在寄存器中,编译器可以随意忽略它。

在 Java 中,该方法将被解释,直到热点 JIT 启发式地确定它需要编译。对于已编译的代码,它使用着色算法将变量和临时值分配给寄存器,或者在寄存器溢出的情况下写入/写入 RAM。

于 2009-02-11T21:01:25.150 回答
3

不,没有办法在 Java 中请求这个。但是,您可以做一些事情来阻止使用寄存器,例如将volatile修饰符应用于成员变量。

于 2009-02-11T21:00:58.097 回答
3

我知道 Java 是一种解释性语言,并且与 CPU 有许多抽象。

你几乎在那里回答了你自己的问题:-)

但说真的,一般来说,尽可能清晰和简单地编写代码,JVM 会尽其所能正确处理您的代码。

于 2009-02-11T22:19:26.957 回答
0

您可以创建一个名为 @register 的注解,但 JVM 肯定会忽略它。例如

@register int i = 0;
于 2009-02-12T21:23:29.767 回答