문제

C ++ 프로그램에서 작업 중이며 단일 1200 라인 파일 (다소 복잡한 상태 기계를 초기화하는)의 컴파일 된 객체 코드가 거의 거대 바이트로 나옵니다. 파일을 그렇게 크게 만들 수있는 것은 무엇입니까? 객체 파일 내부에서 공간을 차지할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

객체 파일이 최소보다 큰 이유는 몇 가지가있을 수 있습니다.

  • 종속적으로 종속 라이브러리를 포함합니다
  • 디버그 정보로 구축
  • 프로파일 링 정보로 건축
  • 템플릿을 사용하여 (매우) 복잡한 데이터 구조 만들기 (아마도 재귀 부스트 구조)
  • 컴파일하는 동안 플래그 최적화를 켜지 않음 (너무 많이 절약하지 않으며 너무 극도로 사용하면 어려움을 유발할 수 있습니다).

처음에는 디버그 정보로 제작하는지 확인하는 것이 좋습니다. 이로 인해 내 경험에서 가장 큰 부풀어 오릅니다.

다른 팁

(최적화와 데드 코드 스트리핑이 켜져 있다고 가정합니다).

링커의 "맵 파일 생성"옵션을 켜고 출력을 검사하십시오.

일반적인 범인은 대량의 코드를 생성하는 매크로/템플릿과 대규모 글로벌 객체입니다.

아마도 일부 템플릿 인스턴스화 (특히 std::iostreams), 아마도 광범위한 인라인 (즉, 헤더에 완전히 정의 된 클래스). 그러나 처음에 1 메가 바이트 객체 파일의 문제는 무엇입니까? 연결하는 동안 작은 이진이 생길 수 있습니다. 예를 들어 700 kib 바이너리에 연결되는 20 개의 MIB의 객체 파일이있는 프로젝트를 여기에 얻었습니다.

업데이트 : 큰 정적 배열/객체 일 수도 있습니다. 그 외에도 MSVC ++ 및 GCC를 사용하면 파일에 대한 생성 된 어셈블리를 살펴볼 수 있습니다.이 파일은 힌트를 줄 수 있습니다 (GCC는 다음과 같습니다. g++ -S foo.cpp, MSVC ++의 경우 '/fas'). 당신이 볼 수 있습니다 많이 템플릿 인스턴스의 이유는 이유입니다. 그렇지 않다면, 그것은 객체 크기입니다 static 사물.

또 다른 가능한 이유는 VC ++ 옵션 인 링크 시간 코드 생성입니다. 이것은 컴파일러의 백엔드를 링커로 이동시킵니다. 이를 통해 더 나은 최적화가 가능하지만 객체 파일에는 일반적으로 전면과 백엔드 사이에 전달되는 모든 내부 데이터 구조가 포함되어야합니다.

다음은 컴파일 시간 값을 보는 데 사용하는 매크로입니다.

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

그런 다음 컴파일 시간을 행복하게하여 공간을 차지하는 기호를 확인하십시오.

편집 : 아무도 이것을 이해하지 못하는 것처럼 보이기 때문에, 나는 이것을 사용하는 방법은 추가하는 것입니다. compiler_check_number(sizeof(<insert struct or global variable here>)). 컴파일러는 컴파일 타임 오류로 변수 또는 구조물의 크기를 뱉어냅니다. 거대한 객체 파일의 이유는 코드입니다.

나는 항상 이것을 사용하여 디버거를 실행하지 않고 큰 일이 얼마나 큰지 알아보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top