4

今日Javaコードを閲覧していて、何かに気づきました。

int[] m = mag;
int len = m.length;
int[] xm = xInt.mag;
if (len != xm.length)
    return false;

(これはBigIntegerクラスにあり、解凍すると見つかりsrc.zipます。メソッドにあります。) 1回だけ使用すると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が作成され、1回だけ使用されます。

4

4 に答える 4

2

magはフィールドであるため、mはローカル変数です。最近のJITはそのような代替ローカル変数を自動的に作成できますが、ローカル変数へのアクセスはより高速になる可能性があります。

ところで、あなたはあなたが考えていた方法を教えて(私はそれがそうであることがわかりましたequals())、逆コンパイルされたものではなく元のソース(それは利用可能です)を引用する必要があります。

于 2012-11-28T02:01:43.720 に答える
1

少し(数行)さらに下に、彼らは使用します

for (int i = 0; i < len; i++)
    if (xm[i] != m[i])
        return false;

したがってm、完全に分離されているわけではありません。確かmagに代わりに使用することもできますが、それは単なる設計上の選択です。

于 2012-11-28T01:37:56.653 に答える
0

定数時間演算であるリフレクションを介してlength(のパブリック最終メンバー変数)を呼び出す場合。ただし、 C++ではArray同じではありません。最初の配列サイズをバイト単位で取得し、この結果をintのサイズで除算して正確な値を取得する必要があります(おそらくより良い方法があります)。開発者はC++回と同じ反射神経を持っており、ローカル変数に値を持ち込んで数回使用していると思います。

于 2012-11-28T02:17:59.023 に答える
0

なぜそれがあなたにとって重要なのですか?ステートメントは配列をコピーするのではなく、参照(ポインター)をコピーするだけです。また、「m」はレジスタに割り当てられる可能性がありますが、JVM標準では、通常、「mag」をオブジェクトから再フェッチする必要があります。JITCは、フィールド参照を自由に最適化できません。

于 2012-11-28T02:21:04.673 に答える