본문 바로가기

Library/C/C++

STLport : Another STL Implementation

 프로그램의 성능을 향상시키는 방법 중, 가장 간단하고 단순한 방법은 사용하는 라이브러리를 교체해보는 것이다. 별다른 최적화 없이, 단순히 라이브러리를 교체하는 것만으로도 기대했던 것 이상의 성능 향상 효과를 볼 수도 있다.

그런 라이브러리 중 가장 중요한 것을 꼽으라면 STL 라이브러리이다. 지금 STL은 완전히 C++ 표준에 포함되어 STL이라는 것이 지칭하는 대상이 애매하다. STL의 혁명적인 발상은 기존의 C++ 표준 라이브러리(iostream이나 string과 같은)에 영향을 끼쳐, 오히려 표준 라이브러리가 STL에 맞춰 고쳐졌을 정도였으니 말이다. 고전적으로, iostream 라이브러리와 별도로 Stepanov가 구현했던 모음을 보통 STL이라고 하는데, 이들이 서로 영향을 끼치며 발전한 지금, C++ 표준 라이브러리를 의미하는 말로도 쓰인다. STL 구현에서 널리 쓰이는 것은 SGI의 STL과 Visual C++의 STL이다. Visual C++의 STL은 MS가 전통적으로 사용하던 Dinkumware의 구현이며, SGI의 구현은 STLport라는 공개물로 널리 알려져 있다. SGI STL은 Stepanov의 팀이 아직도 관여하고 있고, SGI STL과 STLport는 같은 것으로 간주되지만, 사실 둘은 같은 것이 아니다. SGI STL은 자신들의 STL 구현을 따로 가지고 있으며, STLport는 SGI STL를 다양한 플랫폼에서 사용할 수 있도록 공개 구현한 것이기 때문이다. g++의 경우, SGI STL을 기반으로 직접 자신들의 라이브러리를 만든 것이다. Dinkumware의 STL 구현은 과거 Visual C++ 6.0 시절에 점수를 크게 잃긴 했지만(STLport와 같은 외부 라이브러리를 찾게 된 직접적인 이유), 지금은 상당히 쓸만한 편에 속한다.

STLport의 장점은, 어느 플랫폼에서나 괜찮은 성능을 보여주며, 표준을 잘 지키는 구현이라는 점이다. 이런 장점은 이식성 있는 코드를 작성하는데 도움이 된다. Visual C++ STL 구현은, 일반적으로 프로그래머들이 잘 신경쓰지 않는 부분을 감안하여 나름대로 트릭을 가한 부분이 많지만, 이상한 부분이 있다. 예를 들어, Visual C++ STL의 vector::size()와  empty()를 살펴보면 사실 둘의 성능 차이는 없다. 하지만, 이것은 Visual C++ STL의 구현이 그러한 것일 뿐, 표준에서 size()와 empty()의 복잡도는 다르다(Meyers의 EC++를 꺼내보라). 프로그래머가 이것을 주의하지 않고 코드를 작성했다면, 같은 코드를 Visual C++ STL이 아닌 다른 플랫폼에서 컴파일했을 때 성능이 크게 하락할 수도 있다.

물론, STLport가 Visual C++ STL보다 성능이 못한 부분도 있지만, STLport는 훌륭한 STL 공개 / 멀티플랫폼 구현물이다. 자신의 코드의 품질을 더 끌어올리고 싶거나, 간단히 라이브러리를 교체하는 것으로 성능을 더 올리고 싶을 때 충분히 고려해볼만한 라이브러리이다. STLport의 홈페이지는 다음과 같다 : http://www.stlport.org/

STLport는 컴파일된 바이너리를 제공하지 않으며, STLport를 사용하고자 한다면 소스에서부터 원하는 버전의 STLport를 직접 빌드해야 한다. Visual C++ 환경에서 STLport를 빌드하는 것은 install 파일을 살펴보면 알 수 있지만, 간단히 소개하면 다음과 같다.

1. 적절한 폴더에 다운 받은 STLport의 압축을 해제한다.
2. configure 배치 파일로 빌드 환경을 설정한다. configure --help를 쳐보면 보다 자세하게 알 수 있을 것이다. 자신의 컴파일러에 맞춰주는 것이 가장 중요하다. Visual C++ 9.0의 경우 configure msvc9라고 입력한다. 그 외의 옵션은 원하는대로 설정하면 된다.

3. build / lib 폴더에서 nmake clean install을 입력한다. nmake는 MS의 Visual C++ 툴이다. 원래 폴더의 lib와 bin에 .lib 파일과 .dll 파일이 생성된다. .dll 파일은, 동적으로 C 런타임 라이브러리와 링크되도록 했다면 Path 내에 존재해야 한다. 빌드는 Visual Studio Command Prompt에서 실행해야 한다. 일반 커맨드 프롬프트에서 빌드해도 상관없지만, Visual C++ 컴파일러, 링커, nmake가 문제없이 동작할 수 있어야 한다.

4. STLport를 사용하고자 하는 프로젝트에서 include 폴더와 lib 폴더를 설정한다. 이것이 귀찮다면 전역적 범위에서 VC include, lib 폴더를 설정한다. 물론, 이 때는 Visual C++ STL 구현보다 먼저 참조되도록 순서를 조정해야 한다.


한 가지 더, 프로젝트에서 하나의 STL 라이브러리를 선택했다면, 다른 STL 라이브러리와 섞어쓰지 않는 것이 좋다. 예를 들어, 한쪽은 Dinkumware의 구현으로 컴파일한 오브젝트들이 있고, 다른 쪽은 STLport로 컴파일한 오브젝트들이 있을 때, 이들을 함께 링크하면 링크는 되지만 런타임 시점에서 제대로 동작하지 않을 것이다.