Javaメソッド宣言におけるパラメータの最大数 質問する

Javaメソッド宣言におけるパラメータの最大数 質問する

Java のメソッドが持つことができるパラメータの最大数はいくつですか、またその理由は何ですか?

64 ビット Windows システムで Java 1.8 を使用しています。

これに関する StackOverflow の回答では、技術的な制限は 255 パラメータであると述べられていますが、その理由は明記されていません。

正確には、静的メソッドの場合は 255、非静的メソッドの場合は 254 (thisこの場合は 255 番目) です。

これは何らかの仕様で記述でき、許可されるパラメータの最大数が静的に定義されているだけだと考えました。

しかし、これはintおよびすべての4バイト型パラメータを使用していくつかテストを実行しましたlongが、その場合、宣言できるパラメータは 127 個だけでした。

パラメータの場合String、テストから推測した許容数は 255 です (Java では参照サイズが 4 バイトだからでしょうか)。

しかし、64 ビット システムを使用しているため、参照サイズは 8 バイト幅である必要があり、Stringパラメータの場合、許容される最大数はlong型と同様に 127 である必要があります。

この制限は具体的にはどのように適用されるのでしょうか?

制限は何か関係があるのでしょうか?スタックサイズ方法の?

注: 実際には、どのメソッドでもこれほど多くのパラメータを使用するつもりはありませんが、この質問は正確な動作を明確にするためだけのものです。

ベストアンサー1

その制限は、JVM仕様:

メソッドパラメータの数255に制限されていますメソッド記述子の定義(§4.3.3)では、制限には1単位が含まれる。これインスタンスまたはインターフェース メソッドの呼び出しの場合。

セクション§4.3.3追加情報:

メソッド記述子は、メソッドパラメータの合計長が255以下の場合にのみ有効であり、その長さには、これインスタンスまたはインターフェース メソッドの呼び出しの場合。

全長は個々のパラメータの寄与を合計して計算されます。ここで、long型またはdouble型のパラメータは長さに2単位寄与し、その他の型のパラメータは長さに1単位寄与する。

あなたの観察は正確です。ダブルワードプリミティブ(long/ double)は通常の4バイト変数の2倍のサイズが必要です。4バイトのオブジェクトインスタンス参照

64ビットシステムに関する最後の質問については、仕様では、単位パラメータ寄与、仕様のその部分依然として遵守する必要があるStrings64 ビット プラットフォームでも、64 ビット JVM は、内部オブジェクトのポインター サイズに関係なく、255 個のインスタンス パラメーター (255 など) に対応します。

おすすめ記事