2010-01-23 5 views
4

부스트 기능을 사용할 때 앱 크기는 약 0.1 ~ 0.3MB 정도 증가하는 경향이 있습니다. 이것은별로 좋아 보이지 않을 수도 있지만, 다른 외부 라이브러리를 사용하는 것과 비교하면 (적어도 나를 위해). 왜 이런거야?왜 부스트를 사용하면 파일 크기가 너무 커지나요?

+1

부스트의 어느 부분입니까? – GManNickG

+0

현재 파일 시스템, lexical_cast, random 및 bind를 사용 중입니다. – Anonymous

+2

너무 빨리 답변을 수락하지 마십시오. 어떤 사람들은 질문조차하지 못했습니다. 이것은 dsimcha에게 아무런 위법이 아닙니다. 다른 사람들에게 기회를주십시오. :) – GManNickG

답변

4

부스트는 템플릿 을 사용합니다.. 이러한 템플릿은 동일한 매개 변수를 사용하여 여러 번 인스턴스화 할 수 있습니다. 충분히 똑똑한 링커는 하나의 복사본을 제외한 모든 것을 버릴 것입니다. 그러나 모든 링커가 충분히 똑똑하지는 않습니다. 또한 템플릿은 때때로 암시 적으로 인스턴스화되며 인스턴스화 된 횟수를 알기조차 어렵습니다.

+3

"모든 링커가 충분히 똑똑하지는 않습니다". 같은 코드의 "여러 사본"을 남기지 못하는 것처럼 벙어리는 "인라인"이라고도합니다. 하지만 템플릿은 정적 라이브러리보다 인라인하기가 쉽습니다. 코드 크기를 늘리지 않고 인라인 만 옵션을 설정하지 않으면 코드 크기가 커집니다. 중복 된 라인 외부 코드와 같이 직선적 인 비효율적 인 경우도 있습니다. –

+3

각 헤더를 참조하는 모든 단일 obj 파일에도 복사본이 생성됩니다. 이러한 템플릿의 대부분은 다른 템플릿 위에 구현되므로 각 템플릿을 여러 템플릿의 수만큼 다중화합니다. 커다란 프로젝트에서 수만개의 cout 템플릿 만 쉽게 얻을 수 있습니다. 그리고 stl과 boost가 구현되는 방식으로, 코드는 어쨌든 대단히 부풀려집니다. 플렉스 mem 조각화 및 최적화 살인은 너무 많은 func ptrs 및 smt ptrs가 있기 때문에 미친 듯이 발생합니다. 간단히 말해서, boost를 전혀 사용하지 말고 stl을되도록 적게 사용하십시오. –

+0

@Charles : 절대적으로 끔찍한 일반적인 조언. 특별히 심각하지 않은 코드 크기를 줄이려는 것이 아니라면 가능한 한 많이 사용해야합니다. – GManNickG

0

모두 사용 방법에 따라 다릅니다. Boost는 많은 템플릿이기 때문에, 사용되는 타입마다 많은 멤버 함수가 컴파일됩니다. n 유형의 부스트를 사용하는 경우 멤버 함수는 (C++ 템플릿으로) n 번 (각 유형마다 하나씩) 정의됩니다.

1

"너무 많이"는 비교 용어입니다. 사과를 오렌지와 비교하고 있습니다. 다른 라이브러리가 작기 만하다면 Boost가 작은 것으로 가정해야한다는 것을 의미하지는 않습니다. 엄청난 양의 일을보세요. 부스트가 당신을 위해 해줍니다!

동일한 기능을 가진 사용자 지정 라이브러리를 만드는 것이 더 적은 크기 일 것입니다. 유일하게 유효한 비교는 "X를하는 Boost의 라이브러리"대 "X를하는 또 다른 라이브러리"입니다. "X를하는 Boost의 라이브러리"와 "Y를하는 또 다른 라이브러리"가 아닙니다.

파일 시스템 라이브러리는 매우 강력합니다.이 라이브러리는 많은 기능을 갖추고 있으며, 간단한 인터페이스를 제공하기위한 백본 코드가 많이 있습니다. 또한, 언급 된 다른 템플릿과 마찬가지로 일반적으로 코드 크기를 늘릴 수 있지만 피할 수있는 방법은 아닙니다. 템플리트 또는 직접 코드화 된 경우, 둘 중 하나가 동일한 크기 코드가됩니다. 유일한 차이점은 템플릿이 훨씬 쉽습니다.

-1

부스트는 주로 매우 일반화되고 때로는 매우 복잡한 템플릿으로 구성됩니다. 즉, 형식 및 함수는 선언에 의해서가 아니라 사용법에 따라 컴파일러에서 만들어집니다. 즉, 소량의 소스 코드는 선언되거나 사용 된 템플릿의 모든 변형을 수행하기 위해 상당량의 오브젝트 코드를 생성 할 수 있습니다. 또한 Boost는 표준 라이브러리에 의존하며, 이러한 종속성도 끌어들입니다. 그러나 가장 중요한 기여는 Boost 소스 코드가 거의 주로 포함 파일에 있다는 사실입니다. 표준 c 포함 파일 (STL 외부)을 포함하면 일반적으로 소스 코드가 거의 포함되지 않으며 구현이없는 대부분 프로토 타입, 작은 매크로 또는 형식 선언이 포함됩니다. Boost는 include 파일에서 대부분의 구현을 포함합니다.

+0

내 경험에 비추어 볼 때 Boost를 사용해야하는 경우 속성과 같은 더 많은 고유 기능을 제공하는 다른 언어를 사용해야 할 수도 있습니다. Boost는 때로는 빌드 - 프로젝트의 시간. – Jordan

관련 문제