2009-10-19 2 views
10

32 비트 및 64 비트 DLL을 모두 생성하는 VC++ 프로젝트 (2005)가 있습니다. 32 비트 dll은 1044KB이고 64 비트 버전은 1620KB입니다. 크기가 왜 그렇게 큰지 궁금합니다. 그냥 큰 주소 크기 때문에 아니면, 내가 누락 된 컴파일러 옵션이 있습니까?64 비트 dll 크기 32 비트보다 50 % 큰

+0

당신이 정적으로 런타임에 연결하고 있는가? 그렇다면 오버 헤드 중 _most_을 추가하는 것이 가장 확실한 런타임입니다. – dirkgently

+0

의미있는 대답을 제공하기에 충분한 정보가 없습니다. 제공된 모든 것은 순수한 추측 일 것입니다. –

+0

어쨌든 x64 코드 크기는 해당 x86 코드보다 50 %에서 66 % 증가합니다. 필자는 증가가 주로 포인터의 크기 (함수 호출 대상 주소 포함) 때문인 것으로 생각했습니다. 그러나 나는 어떤 종류의 엄격한 연구/분석도 보지 못했습니다. 나는 그것이 분명히 흥미로울 것이라고 생각한다. 나는 누군가가 포인터를 게시하기를 희망한다. –

답변

13

코드에 많은 포인터가 포함되어있을 수 있습니다.

The Free Lunch Is Over

.... 제외하고

는 (: 여기에 최근에 내 컴파일러 팀에 충돌 "공간 속도" 을 입증하는 일화의 컴파일러는 같은 소스 기반을 사용합니다. 32 비트 및 64 비트 컴파일러의 경우 코드는 단지 이고 32 비트 프로세스로 컴파일되거나 은 64 비트 컴파일러입니다 .64 비트 컴파일러 은 훌륭한 d 기본 코드 의 성능은 CPU가 인데 비해 CPU가 인데 반해 CPU가 을 작동하는 데 더 많은 레지스터가 있었고 다른 코드 성능이 이었기 때문에 주로 실행되었습니다. 모두 좋고 좋아. 그러나 데이터에 대해 은 무엇입니까? 가는 64 비트는 특히 들이 예전 두 배의 크기를 지금부터 코스 포인터의 것을 제외하고, 메모리에 있지 변화에게 대부분의 데이터의 크기를했다. 공교롭게도, 우리의 컴파일러는 어느 것 응용 프로그램의 대부분의 다른 종류에 비해 구조의 내부 데이터에 크게 훨씬 더 포인터를 사용합니다. 포인터가 이제 4 바이트 대신 8 바이트가 되었기 때문에 순수한 데이터 크기가 늘어났습니다. 은 64 비트 컴파일러의 작업 집합에서 상당한 증가를 보았습니다. 그 더 큰 작업 집합은 성능 저하를 야기했습니다. 은 코드 실행을 정확히 오프셋합니다. 성능 향상은 에서 더 많은 프로세서를 사용하므로 레지스터가 더 많습니다. 이 글을 쓰는 시점에서 64 비트 컴파일러는 의 속도 (32 비트 컴파일러)에서 실행됩니다. 도 소스베이스는 일 때 동일하고 64 비트 프로세서는 원시 처리 처리량이 더 우수합니다 ( ). 공간은 속도입니다.)

+2

이 스 니펫은 코드의 크기가 아니라 데이터의 크기를 나타냅니다. 그러나 결과와 이유는 코드와 데이터가 비슷할 것이라고 생각합니다. –

+0

게시판 덕분에 매우 흥미 롭습니다. –

2

포인터 크기가 두 배가되기 때문에 코드에 많은 포인터가 있으면 실행 파일이 50 % 쉽게 증가 할 수 있습니다.

3

x86-64에는 더 많은 레지스터가 있습니다. 결과적으로 opcode는이를 지정하기 위해 더 많은 비트가 필요합니다. 또한 x86의 전통에 따라 레지스터의 일부를 지정할 수 있으며 이제는 32 비트 부분 레지스터가 있습니다. 레지스터를 사용하지 않는 명령어는 거의 없으므로 이러한 변경은 거의 모든 명령어에 영향을 미칩니다. x86-64는 여전히 CISC 가변 길이 ISA이기 때문에 각 명령어가 32 비트에서 64 비트까지 커짐을 의미하지는 않지만 확실한 성장이 있습니다.

또 다른 변화는 movq이 일정에 레지스터를 설정하는 연산 코드는 64 개 비트 정수를 필요로한다는 것이다 (그러나 옵 코드의 다른 상수는 여전히 32 비트입니다)

+0

또한 확장 레지스터 (r8-r15 또는 xmm8-xmm15) 중 하나에 액세스하는 모든 명령어는 REX 접두사를 사용해야하므로 각 명령어의 크기에 4 비트가 추가됩니다. 64 비트 연산인지 여부는 중요하지 않습니다. 예를 들어, addl % eax, % ebx는 addl % eax, % r8d보다 4 비트 짧을 것입니다. (컴파일러는 이것을 고려하여 가능한 경우 더 짧은 코드 크기를 제공하는 레지스터를 사용해야하지만 Visual C가 그렇게하는 지 명확하게 알지 못합니다.) –

관련 문제