programing

Java 메서드 선언의 최대 매개 변수 수

projobs 2022. 12. 20. 22:55
반응형

Java 메서드 선언의 최대 매개 변수 수

Java 메서드에서 지정할 수 있는 파라미터의 최대 수는 몇 개이며 그 이유는 무엇입니까?

64비트 Windows 시스템에서 Java 1.8을 사용하고 있습니다.

이에 대한 StackOverflow의 모든 답변에는 이유를 지정하지 않고 기술적 제한이 255 파라미터라고 되어 있습니다.

말하면 , 스태틱의 경우 입니다( 「255개, 254개).this255일)로 하다.

저는 이것이 일종의 사양으로 설명될 수 있고, 허용되는 최대 파라미터의 수가 정적으로 정의되어 있다고 생각했습니다.

단, 이것은 및 모든 4바이트 유형에 대해서만 유효합니다.제가 몇 가지 테스트를 해봤는데long그 경우에는 127개의 파라미터만 선언할 수 있었습니다.

★★★★★★★★★★★★★★★★ String255달러이다(자바?에서는 참조 사이즈가 4바이트이기 때문일 수 있습니다).

, 시스템을 에, 사이즈는 로 할 64비트에서는 8바이트가 됩니다.String127로, 127로, 127로 비슷해야 .longtypes.timeout.

이 제한은 정확히 어떻게 적용됩니까?

제한은 메서드의 스택사이즈와 관계가 있습니까?

주의: 이 많은 파라미터를 실제로 사용하는 것은 아닙니다만, 이 질문은, 정확한 동작을 명확하게 하기 위해서입니다.

이 제한은 JVM 사양에 정의되어 있습니다.

메서드 파라미터의 수는 메서드 기술자('4.3.3')의 정의에 따라 255로 제한됩니다.인스턴스 또는 인터페이스 메서드 호출의 경우 메서드 기술자(이하 '4.3.3')에 대한 유닛이 1개 포함되어 있습니다.

섹션 § 4.3.3은 몇 가지 추가 정보를 제공한다.

메서드 기술자는 총 길이가 255 이하인 메서드 파라미터를 나타내는 경우에만 유효합니다.이 길이에는 인스턴스 또는 인터페이스 메서드 호출의 경우 이 파라미터의 영향이 포함됩니다.

전체 길이는 개별 파라미터의 기여도를 합산하여 계산됩니다.여기서 long 또는 double 타입의 파라미터는 길이에 대해 2개의 단위를 기여하고 다른 타입의 파라미터는 1개의 단위를 기여합니다.

했습니다. 입니다. 이중 단어 원어민입니다.long/double)는 통상적인 4바이트 변수와 4바이트 오브젝트인스턴스 참조의 2배가 필요합니다.

64비트 시스템과 관련된 질문의 마지막 부분에 대해서는 사양에 따라 파라미터가 몇 유닛을 제공하는지가 정의되어 있습니다.64비트 플랫폼에서도 이 사양의 일부를 준수해야 합니다.64비트 JVM은 255개의 인스턴스 파라미터를 수용합니다(예: 255).Strings 오브젝트의 포인터사이즈에 , 「내부 오브젝트의 포인터 크기에 관계없이 사용할 수 있습니다.

JVM 사양 섹션 4.3.3에는 원하는 정보가 나와 있습니다.

메서드 기술자는 총 길이가 255 이하인 메서드 파라미터를 나타내는 경우에만 유효합니다.이 길이에는 인스턴스 또는 인터페이스 메서드 호출의 경우 이 파라미터의 영향이 포함됩니다.전체 길이는 개별 파라미터의 기여도를 합산하여 계산됩니다.여기long 또는 double 타입의 파라미터길이에 대해 2개단위기여하고 다른 타입의 파라미터는 1개의 단위를 기여합니다.

따라서 호스트 시스템이 32비트인지 64비트인지 여부는 매개 변수 수에 영향을 미치지 않습니다.문서에는 "단위"라는 용어가 기재되어 있습니다.여기서 1개의 "단위"의 길이는 단어 크기의 함수입니다.파라미터의 수가 워드 사이즈에 정비례하는 경우는, 휴대성의 문제가 있습니다.즉, 다른 아키텍처에서는 같은 Java 프로그램을 컴파일 할 수 없습니다(단, 적어도1개의 메서드가 워드 사이즈가 큰 아키텍처의 파라미터의 최대수를 사용했다고 가정합니다).

이에 대한 뉴스레터 http://www.javaspecialists.eu/archive/Issue059.html에서 흥미로운 문제를 발견했습니다.

클래스 단위 또는 인터페이스 단위 상수 풀은 ClassFile 구조의 16비트 constant_pool_count 필드에 의해 65535 엔트리로 제한됩니다.이는 단일 클래스 또는 인터페이스의 총 복잡도에 대한 내부 제한으로 작용합니다.비네이티브 및 비추상 메서드별 코드 양은 Code Atribute의 exception_table, LineNumberTable Atribute 및 LocalVariableTable Atribute의 인덱스 크기에 따라 65536 바이트로 제한됩니다.

메서드 호출 시 작성된 프레임의 로컬 변수 배열에서 로컬 변수의 최대 수는 메서드 코드를 제공하는 Code Atribut의 max_locals 항목 크기에 따라 65535로 제한됩니다.long형 및 double형 값은 각각 2개의 로컬 변수를 예약하고 max_locals 값에 대해 2개의 단위를 제공하는 것으로 간주되므로 이러한 유형의 로컬 변수를 사용하면 이 제한이 더욱 줄어듭니다.

클래스 또는 인터페이스에서 선언할 수 있는 필드 수는 ClassFile 구조의 fields_count 항목 크기에 따라 65535로 제한됩니다.ClassFile 구조의 fields_count 항목 값에는 슈퍼클래스 또는 슈퍼인터페이스에서 상속된 필드는 포함되지 않습니다.

언급URL : https://stackoverflow.com/questions/30581531/maximum-number-of-parameters-in-java-method-declaration

반응형