32 비트 및 64 비트 DLL을 모두 생성하는 VC++ 프로젝트 (2005)가 있습니다. 32 비트 dll은 1044KB이고 64 비트 버전은 1620KB입니다. 크기가 왜 그렇게 큰지 궁금합니다. 그냥 큰 주소 크기 때문에 아니면, 내가 누락 된 컴파일러 옵션이 있습니까?64 비트 dll 크기 32 비트보다 50 % 큰
답변
코드에 많은 포인터가 포함되어있을 수 있습니다.
.... 제외하고
는 (: 여기에 최근에 내 컴파일러 팀에 충돌 "공간 속도" 을 입증하는 일화의 컴파일러는 같은 소스 기반을 사용합니다. 32 비트 및 64 비트 컴파일러의 경우 코드는 단지 이고 32 비트 프로세스로 컴파일되거나 은 64 비트 컴파일러입니다 .64 비트 컴파일러 은 훌륭한 d 기본 코드 의 성능은 CPU가 인데 비해 CPU가 인데 반해 CPU가 을 작동하는 데 더 많은 레지스터가 있었고 다른 코드 성능이 이었기 때문에 주로 실행되었습니다. 모두 좋고 좋아. 그러나 데이터에 대해 은 무엇입니까? 가는 64 비트는 특히 들이 예전 두 배의 크기를 지금부터 코스 포인터의 것을 제외하고, 메모리에 있지 변화에게 대부분의 데이터의 크기를했다. 공교롭게도, 우리의 컴파일러는 어느 것 응용 프로그램의 대부분의 다른 종류에 비해 구조의 내부 데이터에 크게 훨씬 더 포인터를 사용합니다. 포인터가 이제 4 바이트 대신 8 바이트가 되었기 때문에 순수한 데이터 크기가 늘어났습니다. 은 64 비트 컴파일러의 작업 집합에서 상당한 증가를 보았습니다. 그 더 큰 작업 집합은 성능 저하를 야기했습니다. 은 코드 실행을 정확히 오프셋합니다. 성능 향상은 에서 더 많은 프로세서를 사용하므로 레지스터가 더 많습니다. 이 글을 쓰는 시점에서 64 비트 컴파일러는 의 속도 (32 비트 컴파일러)에서 실행됩니다. 도 소스베이스는 일 때 동일하고 64 비트 프로세서는 원시 처리 처리량이 더 우수합니다 ( ). 공간은 속도입니다.)
이 스 니펫은 코드의 크기가 아니라 데이터의 크기를 나타냅니다. 그러나 결과와 이유는 코드와 데이터가 비슷할 것이라고 생각합니다. –
게시판 덕분에 매우 흥미 롭습니다. –
포인터 크기가 두 배가되기 때문에 코드에 많은 포인터가 있으면 실행 파일이 50 % 쉽게 증가 할 수 있습니다.
x86-64에는 더 많은 레지스터가 있습니다. 결과적으로 opcode는이를 지정하기 위해 더 많은 비트가 필요합니다. 또한 x86의 전통에 따라 레지스터의 일부를 지정할 수 있으며 이제는 32 비트 부분 레지스터가 있습니다. 레지스터를 사용하지 않는 명령어는 거의 없으므로 이러한 변경은 거의 모든 명령어에 영향을 미칩니다. x86-64는 여전히 CISC 가변 길이 ISA이기 때문에 각 명령어가 32 비트에서 64 비트까지 커짐을 의미하지는 않지만 확실한 성장이 있습니다.
또 다른 변화는 movq
이 일정에 레지스터를 설정하는 연산 코드는 64 개 비트 정수를 필요로한다는 것이다 (그러나 옵 코드의 다른 상수는 여전히 32 비트입니다)
또한 확장 레지스터 (r8-r15 또는 xmm8-xmm15) 중 하나에 액세스하는 모든 명령어는 REX 접두사를 사용해야하므로 각 명령어의 크기에 4 비트가 추가됩니다. 64 비트 연산인지 여부는 중요하지 않습니다. 예를 들어, addl % eax, % ebx는 addl % eax, % r8d보다 4 비트 짧을 것입니다. (컴파일러는 이것을 고려하여 가능한 경우 더 짧은 코드 크기를 제공하는 레지스터를 사용해야하지만 Visual C가 그렇게하는 지 명확하게 알지 못합니다.) –
- 1. Office의 32 비트 DLL 64 비트
- 2. 64 비트 컴퓨터에서 32 비트 DLL 사용
- 3. Win7 64/32 비트 C# dll 의심
- 4. 포트란 : 32 비트/64 비트 성능 이식성
- 5. 64 비트 OS에서 32 비트 ActiveX DLL 문제
- 6. 64 비트 .Net 응용 프로그램에서 가져 오는 32 비트 dll
- 7. 32 비트 64 비트 호환
- 8. 32 비트/64 비트 OS?
- 9. 개발 컴퓨터에 32 비트 또는 64 비트 OS를 사용해야합니까?
- 10. 64 비트 Weblogic 서버의 32 비트 JDK
- 11. 최대 JVM 힙 크기 이해 - 32 비트 대 64 비트
- 12. 64 비트 OS에서 in-process wmi provider (32 비트)의 native dll (32 비트)로드
- 13. 32 비트 응용 프로그램에서 64 비트 dll (64 비트 OS)을 등록하는 방법
- 14. 64 비트 Solaris에서 32 비트 포인터로 컴파일
- 15. 샤드 크기 (32 비트)?
- 16. 어느 mysql 32/64 비트
- 17. 32 대 64 비트 GC
- 18. Windows Azure의 32 비트 레거시 COM DLL
- 19. 32 비트 윈도우 아래의 64 비트 레지스터
- 20. 32 비트 및 64 비트 ASP.NET 배포
- 21. 64 비트 어셈블리의 32 비트 명령어들
- 22. 32 비트/64 비트 시스템에 관한 질문
- 23. * .WAR (64 비트 x 32 비트) 생성
- 24. 32 비트 64 비트 참조 라이브러리
- 25. SharePoint 64 비트 또는 32 비트
- 26. 64 비트 Windows 2008의 32 비트 cluster.exe
- 27. 32 비트 Windows XP 64 비트 VM
- 28. 32 비트 dll에서 64 비트 dll로 변환
- 29. SHGetFolderPath() 32 비트 대 64 비트
- 30. 32 비트 라이브러리를 64 비트 프로그램에 연결
당신이 정적으로 런타임에 연결하고 있는가? 그렇다면 오버 헤드 중 _most_을 추가하는 것이 가장 확실한 런타임입니다. – dirkgently
의미있는 대답을 제공하기에 충분한 정보가 없습니다. 제공된 모든 것은 순수한 추측 일 것입니다. –
어쨌든 x64 코드 크기는 해당 x86 코드보다 50 %에서 66 % 증가합니다. 필자는 증가가 주로 포인터의 크기 (함수 호출 대상 주소 포함) 때문인 것으로 생각했습니다. 그러나 나는 어떤 종류의 엄격한 연구/분석도 보지 못했습니다. 나는 그것이 분명히 흥미로울 것이라고 생각한다. 나는 누군가가 포인터를 게시하기를 희망한다. –