2012-08-05 2 views
2

가능한 중복 : 그냥 호기심
Why are compiled Java class files smaller than C compiled files?C/C++ "Hello World"가 킬로바이트 단위 인 이유는 무엇입니까?

난 그냥 C, C++ 및 Java에서 "안녕 세계"를 컴파일.

자바 클래스 파일은 런타임이 바이너리에 포함되어 있지 않기 때문에 이해할 수있는 423B에서 매우 가늘다.

C 및 C++ 코드는 8.5K 및 9.2K입니다.

왜 그렇게 큰 편입니까? 나는 항상 stdio 나 iostream이 동적으로 링크되어 있고 실행 파일의 크기에 추가하지 않는다고 가정했다.

그래서 모든 킬로바이트는 어디에서 왔습니까? 헥스 덤프를 보면 퍼팅이 많이 발생한다는 것을 알 수 있습니다. 퍼포먼스의 이유로 추측합니다. 바이너리 형식이 왜 그렇게 구성되어 있습니까?


pmg의 링크는 매우 유용합니다!

패딩과 관련해서는 프로그램의 세그먼트를 가상 메모리 페이지 경계 (4096 바이트)에 정렬하여 최소 8192 바이트가되는 것을 발견했습니다. 최상의 성능 (OS X와 ​​iOS 용) 마하 O 바이너리 포맷 대하여

는 세그먼트 파워 및 x86 프로세서의 가상 메모리 페이지 경계-4096 바이트 정렬되어야한다. 세그먼트 크기를 계산하려면 각 섹션의 크기를 더한 다음 합계를 다음 가상 메모리 페이지 경계 (4096 바이트 또는 4 킬로바이트)로 올림하십시오. 이 알고리즘을 사용하면 세그먼트의 최소 크기는 4 킬로바이트이고 그 이후에는 4 킬로바이트 씩 증가합니다. http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html

내가 다음에 시간을 요청하기 전에 연구를 할 수 있습니다 인용

)

+12

당신은 [리눅스 정말 얼른 ELF 실행 파일을 만들기에 회오리 바람 튜토리얼]를 읽을 것 같아서 (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html). – pmg

+0

그것은 대부분 지금 패딩입니다. – Phantrast

+0

@pmg - 그 링크에 감사드립니다. 그것은 매우 잘 쓰여진 놀라운 작품입니다. –

답변

4

이것은 측정하고있는 질문입니다. 원시 실행 파일 크기라면 main() 코드 외에 많은 부분이 포함되어 있습니다.

여기서 공유 동적 라이브러리를 사용하기 때문에 기호 테이블, 전역 오프셋 테이블 및 링크 대상 공유 라이브러리에 대한 설명과 같은 하우스 키핑 데이터가 많은 양의 크기를 차지합니다. 공유 라이브러리 자체의 코드는 바이너리에 없습니다.

iostream 라이브러리는 상당히 큰이며, 정적 initialisers있다 - 인스턴스가 cout, cerrcin 객체를 초기화하는. 이것은 오브젝트 파일에 포함되어야하는 또 다른 것입니다. 응용 프로그램이 실행될 때 현실에서

는 여분의 크기의 대부분은 메모리 상주하지 않습니다.

1

은 다음 stdlib가 포함되어 있기 때문이다. -nostdlib

+0

C 표준 라이브러리가 없으면 hello world 프로그램이 연결되지 않거나 원시 시스템 호출로 일부 IO를 수행해야합니다. 매우 작은 바이너리가 발생합니다! – marko

1

한 요소를 사용하려고하면 프로그램과 연결하는 표준 라이브러리의 많은 원인이

#include <iostream> 

입니다. 그러나 걱정할 필요가 없습니다. 이것은 단지 초기 오버 헤드 일 뿐이며 프로그램의 복잡성이나 코드의 길이에 따라 증가하지는 않습니다. 어떤 경우 든 UPX을 사용해보십시오.

2

C & C++는 완전한 독립 실행 형 프로그램입니다. Java는 핵심 코드 일 뿐이며 실행을위한 또 다른 프로그램이 필요합니다.

작은 안녕하세요 세계는 새로운 라인 전체에 (또한 실행하는 다른 프로그램을 필요로 뭔가) bash는 스크립트

echo Hello World 

17 바이트를 사용하는 것입니다.

+0

예 아니요. C와 C++에는 실행 가능한 코드가 있지만 여전히 많은 배관 작업에 의존합니다. OS는 ELF 파일을 구문 분석해야하고 별도의 라이브러리 (stdlib)가 시스템에 있어야합니다. 하지만 파일을 실행 가능한 코드로 변환하는 별도의 인터프리터/컴파일러에 의존하지 않는다는 것이 옳았습니다. – jalf

관련 문제