이 모든 것이 Java 및 C ++ 모두에 대해 깊이 구현 정의되어 있음을 알고 싶습니다. 즉, Java의 객체 모델에는 약간의 공간이 필요합니다.
C ++ 객체는하지 (일반적으로) 필요한 모든 구성원이 필요로하는 것을 제외하고 저장합니다. (사용자 정의 모든 것이 참조 유형 인 Java와 달리) 클라이언트 코드는 값 유형 또는 참조 유형으로 객체를 사용할 수 있습니다. 즉, 객체는 다른 객체에 대한 포인터 / 참조를 저장하거나 객체를 직접 저장할 수 있습니다. 간접적으로. virtual
메소드 가있는 경우 객체 당 하나의 추가 포인터가 필요 하지만 다형성없이 처리 할 수있는 유용한 클래스가 상당히 많으며이를 필요로하지 않습니다. GC 메타 데이터와 객체 별 잠금이 없습니다. 따라서 class IntWrapper { int x; public: IntWrapper(int); ... };
객체는 일반 공간보다 더 많은 공간을 필요로하지 않으며 int
컬렉션 및 기타 객체에 직접 (즉, 간접적으로) 배치 할 수 있습니다.
C ++의 Java 배열과 동등한 사전 제작이 없으므로 배열은 까다로워집니다. new[]
오버 헤드 / 메타 데이터가없는 객체를 단순히 할당 할 수는 있지만 길이 필드는 없습니다. 구현은 아마도 하나를 저장하지만 액세스 할 수는 없습니다. std::vector
동적 배열이므로 추가 오버 헤드와 더 큰 인터페이스가 있습니다. std::array
및 C 스타일 배열 (int arr[N];
), 컴파일 타임 상수가 필요합니다. 이론 상으로는 객체의 저장 공간과 길이에 대한 단일 정수가되어야합니다. 그러나 공간을 거의 차지하지 않으면 서 동적 크기 조정과 완전한 기능을 갖춘 인터페이스를 얻을 수 있기 때문에 실제로 사용하면됩니다. 이러한 컬렉션과 다른 모든 컬렉션은 기본적으로 개체를 값으로 저장하므로 간접 참조 및 참조 공간을 절약하고 캐시 동작을 향상시킵니다. 간접적으로 얻으려면 포인터를 명시 적으로 저장해야합니다 (스마트 포인터).
이러한 비용 절감 중 일부는 Java에 포함 된 기능을 포함하지 않아서 제공되며 C ++에 해당하는 것이 Java에 해당하는 것 (*)보다 덜 최적화되기 때문에 위의 비교는 전적으로 공평하지 않습니다. 일반적인 방법은 구현 virtual
정확하게 구현하는 일반적인 방법으로 많은 오버 헤드로 C ++을 강요하며에서 virtual
자바. 잠금을 얻으려면 완전한 기능을 갖춘 mutex 객체가 필요합니다.이 객체는 아마도 몇 비트보다 큽니다. (참조 카운트를 얻으려면 하지GC와 동일하며 사용해서는 안되지만 때로는 유용해야 함) 참조 카운트 필드를 추가하는 스마트 포인터가 필요합니다. 개체를 신중하게 구성하지 않으면 참조 수, 스마트 포인터 개체 및 참조 개체가 완전히 별도의 위치에 있으며, 올바르게 구성하더라도 공유 포인터는 여전히 하나가 아니라 두 개의 포인터 일 수 있습니다. 다시 말하지만, 좋은 C ++ 스타일은 이러한 기능을 충분히 사용하지 않으므로 실제로 작성된 C ++ 라이브러리의 객체는 더 적게 사용합니다. 이것이 반드시 전체 메모리 사용량을 의미 하지는 않지만 C ++이 이와 관련하여 좋은 출발을 의미합니다.
(*) 예를 들어, 유형 정보를 다양한 플래그와 병합하고 객체에 대한 잠금 비트를 제거하여 가상 통화, ID 해시 코드 및 일부 객체에 대해 한 단어로만 잠금 (및 다른 많은 객체에 대해 두 단어로)을 얻을 수 있습니다. 자물쇠가 필요할 것 같지 않습니다. 참조 자바 객체 모델의 공간 - 및 시간 효율적인 구현 이 다른 최적화에 대한 자세한 설명은 데이비드 F. 베이컨, 스티븐 J. 핑크, 데이비드 로브로 (PDF)를.
int
? 그렇다면 C ++ int가 32 비트 인 한int
Java와 비교해야합니다Integer
.