在C,我可以分配一个寄存器变量,例如:Java相当于register int?
register int i = 0;
我知道,Java是一种解释语言,并且是从CPU许多许多抽象的路程。
是否有任何机制可用于甚至请求(如果体系结构不允许它,那么什么),我的变量保留在寄存器中,而不是移动到缓存或主内存?
我不认为有什么办法,但我之前一直很惊喜。
谢谢
在C,我可以分配一个寄存器变量,例如:Java相当于register int?
register int i = 0;
我知道,Java是一种解释语言,并且是从CPU许多许多抽象的路程。
是否有任何机制可用于甚至请求(如果体系结构不允许它,那么什么),我的变量保留在寄存器中,而不是移动到缓存或主内存?
我不认为有什么办法,但我之前一直很惊喜。
谢谢
不,没有办法在Java中请求它。但是,有些事情可以阻止使用寄存器,例如将volatile
修饰符应用于成员变量。
用C register
不把一个变量来注册。它只是给了编译器一个提示,将它放入寄存器可能会很好。
在Java中没有等价物。
如果在一个很短的空间内使用足够的空间使其成为一个寄存器int值得,那么热点编译器应该能够自己弄清楚。
事实上,热点编译器应该能够比C/C++编译器做得更好,因为它有更多的信息可供使用。 C/C++编译器必须猜测; HotSpot可以测量。
在Java中没有等价物。即使在C中,也不能保证变量将被存储在寄存器中,编译器可以自由地忽略它。
在Java中,该方法将被解释,直到热点JIT启发式地确定它需要被编译。对于编译代码,它使用着色算法将变量和临时值分配给寄存器,或者在寄存器溢出的情况下写入/从RAM写入。
我知道,Java是一种解释 语言,是从CPU许多许多 抽象掉。
你几乎回答了你自己的问题有:-)
但严重的是,在一般情况下,编写代码的明明白白,你可以和JVM将竭尽所能来对待你的代码对。
您可以创建一个名为@register的注释,但JVM肯定会忽略它。 例如
@register int i = 0;
C中的“寄存器”是完全无用的,至少已经有十年了。优化器不需要提示。 – 2009-02-11 21:08:18
“解释型语言”。口译员是语言系统的一个属性,而不是语言。编译大部分(对于某些合适的定义)Java执行。 – 2009-02-11 21:19:34