我今天浏览了Java代码,并注意到了一些事情。
int[] m = mag;
int len = m.length;
int[] xm = xInt.mag;
if (len != xm.length)
return false;
(这是BigInteger
类,可以通过解压缩src.zip
找到。它位于equals
方法中。)为什么创建了一个全新的变量m
什么时候只使用一次?为什么代码不是int len = mag.length
?我也在另一种方法(bitLength
)中看到了这一点,同样,m
只使用了一次。这样做有什么好处,还是这个类的创造者只是一个错误?
编辑:正如@usernametbd指出的那样,稍后会使用它:
for (int i = 0; i < len; i++)
if (xm[i] != m[i])
return false;
但他们仍然可以使用mag
。为什么要制作一个全新的变量?
在另一个函数中(在同一个类中,bitLength
),会生成一个新变量m
,并且只使用一次。
答案 0 :(得分:2)
因为mag是一个字段,所以m是局部变量。尽管现代JIT可以自动创建这样的替代局部变量,但访问局部变量可能会更快。
顺便说一句,你应该告诉你的方法是什么(我发现它是equals()
),并引用原始来源(它是可用的)而不是反编译的。
答案 1 :(得分:1)
进一步向下(几行),他们使用
for (int i = 0; i < len; i++)
if (xm[i] != m[i])
return false;
所以m
并非完全孤立。他们肯定会使用mag
代替,但这只是一个设计选择。
答案 2 :(得分:0)
当您通过反射(即恒定时间操作)调用length
(公共最终成员变量Array
)时。但C++中的情况并不相同。你必须获得第一个数组大小(以字节为单位),然后将此结果除以int的大小以获得精确值(也许有更好的方法)。我认为开发人员从C ++时代就有同样的反应,并将值带入局部变量中以便多次使用。
答案 3 :(得分:0)
为什么对你很重要?该语句不是复制数组,只是复制引用 - 指针。并且“m”可能会被分配到寄存器中,而JVM标准要求通常必须从对象中重新获取“mag” - JITC不能自由地优化远场引用。