programing

Java API는 왜 쇼트나 바이트 대신 int를 사용하는가?

luckcodes 2023. 1. 21. 10:26

Java API는 왜 쇼트나 바이트 대신 int를 사용하는가?

API를 사용하는 는 무엇입니까?int의 경우, 삭제short또는 심지어byte★★★★★★★★★★★★★★★★★★?

예:클래스의 필드에서는int.

작을 , 이러한 타입 「 「 「 」 「 」 )은 왜 행해지는 요.short,int★★★★★★★★★★★★★★★★★★?

그 이유들 중 일부는 이미 지적되었다.예를 들어...(거의) 바이트 단위에서의 모든 연산은 이러한 원본을 int"로 승격합니다.단, 다음 질문은 다음과 같습니다.이러한 유형은 왜int

한 단계 더 깊이 들어가려면:답은 Java Virtual Machine 명령 집합과 관련이 있을 수 있습니다.Java Virtual Machine Specification의 에서 요약한 바와 같이 추가, 분할 등의 모든 통합 산술 연산은 유형에 대해서만 사용할 수 있습니다.int 타입은 " " " 입니다.long, 작은 타입의 경우는 제외합니다.

(쪽: 타입 「」 「」 「 」byte ★★★★★★★★★★★★★★★★★」short)는 기본적으로 어레이만을 대상으로 합니다.같은 배열new byte[1000]를 사용하며 1000바이트의 합니다.new int[1000])

물론, "...다음 질문은 "이러한 설명서는 왜 ( )에만 제공되는가?"입니다.

위의 JVM 사양에 한 가지 이유가 기재되어 있습니다.

각 유형의 명령이 Java Virtual Machine의 모든 런타임 데이터 유형을 지원하는 경우 바이트로 나타낼 수 있는 것보다 더 많은 명령이 있을 것입니다.

또한 Java Virtual Machine은 실제 프로세서의 추상화로 간주할 수 있습니다.또한 소규모 타입을 위한 전용 산술 논리 유닛을 도입하는 것은 고려할 가치가 없습니다.추가 트랜지스터가 필요하지만 여전히 하나의 클럭 사이클에 하나의 추가만 실행할 수 있습니다.JVM이 설계되었을 때의 지배적인 아키텍처는 32비트였습니다.32비트에 딱 맞는 아키텍처입니다.int (). (64비트)long

(주의: 마지막 단락은 벡터화 등을 고려하여 약간 지나치게 단순하지만 프로세서 설계 토픽에 너무 깊이 파고들지 않고 기본적인 아이디어를 제시해야 합니다.)


편집: 질문의 예에 초점을 맞춘 간단한 부록입니다만, 보다 일반적인 의미에서는 다음과 같습니다.또한 작은 유형을 사용하여 필드를 저장하는 것이 유익하지 않은지 물어볼 수도 있습니다.예를 들어, 메모리를 저장함으로써 절약할 수 있다고 생각할 수 있습니다.Calendar.DAY_OF_WEEKbyte여기서 Java Class File Format이 실행됩니다.클래스 파일의 모든 필드가 하나 이상의 "슬롯"을 차지하고 있으며, 이 "슬롯"은 크기가 1개입니다.int().(', ('와이드' 필드,double ★★★★★★★★★★★★★★★★★」long의 슬롯을 , 2개의 슬롯을 점유합니다. 필드를 합니다.short ★★★★★★★★★★★★★★★★★」byte이치노

은 (★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」byte,short을 will them them them them them them them them them them them them them them them them int예를 들어, 다음과 같이 쓸 수 없습니다.

short x = 1;
short y = 2;

short z = x + y; //error

은 산술이 더 요.int가 없다 캐스팅 안 해도 돼요.

공간적인 면에서는 거의 차이가 없습니다. byte ★★★★★★★★★★★★★★★★★」short이 마이크로 최적화는 문제가 복잡해질 것입니다.변수량이 고정되어 있기 때문에 그럴 가치가 없다고 생각합니다.

byte는 임베디드 디바이스용 프로그램 또는 파일/파일을 취급할 때 유용하고 편리합니다.이치노 향후 계산이 한계를 초과할 수도 있습니다.'에 대해서 생각해 보세요.Calendar더 많은 수를 진화시킬 수 있는 클래스입니다.

64비트 프로세서를 사용합니다.int,short다른 원초적인 것들은 전혀 달라지지 않을 거야또한 많은 Java 구현은 변수(및 개체)를* 정렬합니다.


* byte ★★★★★★★★★★★★★★★★★」short int로컬 변수, 클래스 변수 또는 인스턴스 변수인 경우.왜일까요? 대부분의 컴퓨터 시스템에서는 변수 주소가 정렬되어 있기 때문에 예를 들어 1바이트를 사용하면 실제로는 2바이트가 됩니다.하나는 변수 자체용이고 다른 하나는 패딩용입니다.

on on on on on on on on onbyte 1바이트, 1바이트,short와 2바이트를 int어레이에서는 시작 부분과 끝 부분만 정렬하면 되기 때문에 4바이트가 소요됩니다. 예를 '어울리다'와 같이 가 생깁니다.System.arraycopy()이치노

왜냐하면 쇼트보다 정수를 사용할 때 산술 연산이 더 쉽기 때문입니다.가 실제로 .short같이 .API를 사용하다

short month = Calendar.JUNE;
month = month + (short) 1; // is july

시시적캐캐캐캐주주주 주주주주주로 암묵적으로 됩니다.int짧은 시간 안에이것은 사용하기 매우 번거롭기 때문에int값은 종종 상수에 선호됩니다.

이에 비해 스토리지 효율성의 향상은 미미합니다. 왜냐하면 이러한 상수는 고정된 수 밖에 없기 때문입니다.우리는 40개의 상수에 대해 이야기하고 있다.★★★★★★★★★★★★★★★에서 스토리지 변경:int로.short너를 안전하게 해줄까?40 * 16 bit = 80 byte자세한 내용은 이 답변을 참조하십시오.

가상 시스템의 설계 복잡성은 가상 시스템이 수행할 수 있는 작업 종류에 따라 달라집니다."멀티플리"와 같은 명령어를 4개 구현하는 것이 위의 작은 숫자 유형용 버전 외에 32비트 정수용, 64비트 정수용, 32비트 부동 소수점용 및 64비트 부동 소수점용 버전 각각에 대해 구현되는 것보다 쉽습니다.보다 흥미로운 설계 질문은 왜 (64비트 정수를 사용하여 모든 정수 계산을 수행하거나 64비트 부동소수점 값을 사용하여 모든 부동소수점 계산을 수행하거나 둘 다)가 아닌 4가지 유형이 있어야 하는가입니다.32비트 정수를 사용하는 이유는 Java는 32비트 타입이 16비트 또는8비트 타입만큼 빠르게 동작할 수 있는 많은 플랫폼에서 동작할 것으로 예상되지만 64비트 타입에서의 동작은 현저하게 느려지기 때문입니다.16비트 타입의 작업이 고속인 플랫폼에서도 32비트 타입의 작업만으로 32비트 수량의 작업 비용이 상쇄됩니다.

32비트 값에 대해 부동소수점 계산을 수행하는 경우 이점은 다소 명확하지 않습니다.다음과 같은 연산이 가능한 플랫폼이 있습니다.float a=b+c+d;는 모든 오퍼랜드를 보다 높은 레이트의 타입으로 변환하여 추가한 후 결과를 32비트 부동소수점수로 변환하여 저장함으로써 가장 신속하게 실행할 수 있습니다.32비트 부동소수점 값을 사용하여 모든 계산을 수행하는 것이 더 효율적인 다른 플랫폼도 있습니다.Java의 개발자들은 모든 플랫폼이 동일한 방식으로 작업을 수행해야 하며 32비트 부동소수점 연산이 더 긴 PC보다 더 빠른 하드웨어 플랫폼을 선호해야 한다고 결정했습니다. 비록 이 PC가 일반적인 PC와 많은 기계에서 부동소수점 연산의 속도와 정밀도를 모두 심각하게 저하시켜도 마찬가지입니다.부동소수점 단위 없이 nes.btw, btw, btw는 앞서 말한 것과 같은 식을 계산할 때 고정밀 중간연산을 사용하는 것에 주의한다.float a=b+c+d;때때로 모든 중간 피연산자의 달성보다 훨씬 더 정확한 결과를 산출한다.float정확도가 약간 떨어지는 값이 나올 수 있습니다.어쨌든 Sun은 모든 것이 같은 방식으로 진행되어야 한다고 판단하고 최소한의 정밀도를 사용하기로 했습니다.float가치.

작은 데이터 타입의 주된 장점은 다수의 데이터 타입을 어레이에 함께 저장하면 알 수 있습니다.64비트보다 작은 유형의 개별 변수를 갖는 것은 장점이 없지만 보다 작은 값을 보다 콤팩트하게 저장할 수 있는 어레이를 갖는 것이 좋습니다.로컬 변수는 로컬 변수가 됩니다.byte가 아니라long7바이트를 절약합니다.100,000개의 번호 배열을 가지면 각 번호가 1바이트로 유지됩니다.byte가 아니라long7,000,000 바이트를 파동합니다.각 어레이 유형은 몇 가지 작업(특히 항목 읽기, 항목 저장, 어레이 내 항목 범위 복사 또는 어레이 간 항목 범위 복사)만 지원하면 되므로 더 많은 어레이 유형을 직접 사용할 수 있는 이산 수치 유형을 갖는 복잡성만큼 심각하지 않습니다.

만약 당신이 적분 상수가 그들이 들어맞는 가장 작은 타입으로 저장된다는 철학을 사용한다면, 자바에는 심각한 문제가 있을 것이다: 프로그래머가 적분 상수를 사용하여 코드를 작성할 때마다, 그들은 상수의 유형이 중요한지 확인하기 위해 그들의 코드에 세심한 주의를 기울여야 하고, 만약 그렇다면 문서나/또는 문서에서 그 유형을 찾아야 한다.필요한 모든 유형의 변환을 수행합니다.

이제 심각한 문제의 개요를 설명했습니다만, 이 철학을 통해 얻을 수 있는 이점은 무엇입니까?만약 그 변경으로 인해 관찰할 수 있는 유일한 효과가 반사를 통해 상수를 조회했을 때 어떤 타입을 얻을 수 있는지 뿐이라면 나는 놀라지 않을 것이다.(물론 게으름뱅이/실행하는 프로그래머가 상수의 종류를 올바르게 설명하지 않음으로써 발생하는 오류는 무엇이든)

장단점을 따지는 것은 매우 쉽다: 그것은 나쁜 철학이다.

사실, 작은 이점이 있을 거야.를 가지고 있는 경우

class MyTimeAndDayOfWeek {
    byte dayOfWeek;
    byte hour;
    byte minute;
    byte second;
}

일반적인 JVM에서는 1개의 클래스가 포함된 만큼의 공간이 필요합니다.int메모리 소비량은 8바이트 또는 16바이트(IIRC, 설정 가능)의 다음 배수로 반올림되기 때문에 실제로 절약되는 경우는 거의 없습니다.

이 클래스는 만약 대응한다면 조금 더 사용하기 쉬울 것이다.Calendar메서드가 반환했다.byte하지만 그런 건 없어Calendar메서드,만get(int)이 명령어는 다음 명령을 반환해야 합니다.int다른 분야 때문에.작은 타입의 각 조작은 다음과 같이 촉진됩니다.int그래서 캐스팅이 많이 필요해요.

아마 포기하시고 다른 곳으로 갈아타실 겁니다int또는 다음과 같은 세터를 씁니다.

void setDayOfWeek(int dayOfWeek) {
    this.dayOfWeek = checkedCastToByte(dayOfWeek);
}

그 후, 의 타입입니다.DAY_OF_WEEK어쨌든 중요하지 않다.

CPU의 버스 크기보다 작은 변수를 사용하면 더 많은 사이클이 필요하다는 것을 의미합니다.예를 들어 메모리의 1바이트를 갱신할 때 64비트 CPU는 64비트 워드를 통째로 읽고 변경된 부분만 수정한 후 결과를 다시 써야 합니다.

또, 작은 데이터 타입의 동작은 명시적으로 설명되기 때문에, 작은 데이터 타입을 사용하면, 변수가 레지스터에 격납될 때에 오버헤드가 필요하게 됩니다.레지스터 전체가 사용되므로 메서드 파라미터 및 로컬 변수에 대해 더 작은 데이터 유형을 사용해도 얻을 수 있는 것은 없습니다.

다만, 이러한 데이터 타입은, 네트워크 패킷등의 특정의 폭을 필요로 하는 데이터 구조를 나타내거나, 대규모 어레이로 공간을 절약해 속도를 저하시키는 경우에 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/27122610/why-does-the-java-api-use-int-instead-of-short-or-byte