포스트

C++ STL

C++ STL

1. STL(Standard Template Library)이란?

​ STL은 C++의 표준 라이브러리 입니다. ​ 주로 자료구조와 알고리즘을 제공하며 이름처럼 STL은 모든 코드가 템플릿화 되어있습니다. ​ 이를 이용해 직접 특정 기능을 작성하지 않고 제공되는 함수를 통해 손쉽게 기능을 구현할 수 있습니다. ​

표준 라이브러리(Standard Library)란?

​ 표준 라이브러리는 프로그래밍 언어에서 자주 사용되는 함수, 클래스, 데이터 구조 등을 모아 놓은 라이브러리입니다. 이는 개발자가 반복적으로 구현해야 하는 기본적인 기능들을 미리 구현하여 제공함으로써, 프로그래밍의 생산성을 높이고 코드의 일관성과 안정성을 확보하는 데 중요한 역할을 합니다.

​ 단순하게 보면 C++에서 std 네임스페이스 또는 그 하위 네임스페이스를 사용한 함수들은 표준 라이브러리 함수입니다. 또한 표준라이브러리는 헤더를 include할때 <꺽쇄>를 사용합니다.

​ 한가지 혼란 스러운 점이 있다면, ‘STL == 표준 라이브러리’ 인가 하는 점 입니다. 결론적으로 그렇지는 않습니다.

​ 과거에 ISO에서 표준이 만들어지면서 서드파티 라이브러리였던 STL이 편입되었는데, STL이 다른 라이브러리 제작에 큰 영향을 주었고, 그 자체로 표준의 핵심적인 부분이었기 때문에 ‘표준 라이브러리 == STL’ 이라는 혼용이 생겼습니다. 하지만 엄밀히 같은 의미의 단어는 아니고 C++ 표준에도 STL이라는 항목은 따로 존재 하지않습니다.

​ 일반적으로 STL이라고 한다면 C++ 표준 중 container, ierator, algorithm 3개의 라이브러리를 말합니다.

누군가 “STL의 string 라이브러리” 라고 한다면 “C++ 표준 라이브러리 중 string 라이브러리” 라고 이해해도 괜찮고 실제로 string라이브러리가 STL을 이용해서 만들어 졌습니다. 하지만 정확한 표현은 아니다 정도만 인지하면 좋을 것 같습니다.

​ 결론적으로, STL이라는 용어는 C++ 표준 중 “container, ierator, algorithm 3개의 라이브러리” 혹은 관례적으로 “C++ 표준 라이브러리”자체를 지칭하는 용어라고 보면 됩니다.

​ C#은 .Net Framework의 기본 클래스 라이브러리(Base Class Library, BCL)에서, java는 Java Collections Framework에서 비슷한 기능을 제공합니다. 물론 차이가 존재하지만, 각 언어마다 표준 라이브러리가 있습니다. ​ 차이에 관해서는 여기를 참고. ​

2. STL의 구성요소

​ 주로 컨테이너, 알고리즘, 반복자 세 가지를 주요 구성 요소로 봅니다.
​ 이 외에도 함수 객체(Functors)와 어댑터(Adapters) 를 포함해서 볼 수 있습니다.

cppreference.comcppreference.com ​ Null-terminated strings: byte − multibyte − wide ​ en.cppreference.com

+ 세부 구현

  1. xmemory:
    • xmemory는 C++ 표준 라이브러리의 일부로, 메모리 할당 및 해제를 관리하는 데 사용됩니다.
    • 주로 컨테이너 (예: std::vector, std::map)의 내부 메모리 할당을 처리합니다.
    • 코드에서 xmemory를 직접 사용하는 경우는 드뭅니다. 대신 컨테이너를 사용할 때 내부적으로 호출됩니다.

      주요 기능

      1. 할당자(Allocators):
        • xmemory는 표준 할당자 인터페이스를 구현합니다. 할당자는 컨테이너가 메모리를 요청할 때 사용하는 객체로, 메모리 할당 및 해제, 객체의 생성 및 소멸을 담당합니다.
        • 표준 할당자 인터페이스는 std::allocator 클래스를 기반으로 하며, 사용자 정의 할당자를 구현할 때도 이를 기반으로 작성할 수 있습니다.
      2. 오브젝트의 생성과 소멸(Constructor/Destructor):
        • xmemory는 메모리 블록에서 객체를 생성하고 소멸시키는 기능을 제공합니다. 이는 construct와 destroy 함수를 통해 이루어집니다.
      3. 메모리 초기화 및 복사(Memory Initialization and Copying):
        • xmemory는 메모리 블록을 특정 값으로 초기화하거나 다른 블록으로 복사하는 기능을 제공합니다.
      4. 메모리 할당 정책:
        • xmemory는 다양한 메모리 할당 정책을 구현하여, 특정 조건에서 메모리 할당 전략을 최적화할 수 있도록 합니다.
  2. yvals:
    • yvals는 Visual Studio의 C++ 구현에서 사용되는 헤더 파일입니다.
    • 주로 컴파일러 및 라이브러리 구현과 관련된 내부적인 세부 사항을 다룹니다.
    • 보통 사용자가 직접 접근할 필요는 없습니다.

      주요 기능

      1. 컴파일러 및 라이브러리 버전 정보:
        • 이 파일은 MSVC 컴파일러와 표준 라이브러리의 버전 정보를 정의합니다. 이를 통해 코드에서 특정 버전에 맞춰 동작을 조정할 수 있습니다.
      2. 기능 플래그 설정:
        • C++ 표준 라이브러리의 다양한 기능 플래그를 설정합니다. 예를 들어, 특정 C++ 표준 버전(C++11, C++14, C++17 등)에 따라 라이브러리 기능을 활성화하거나 비활성화합니다.
        • 컴파일러가 지원하는 기능을 기준으로 조건부 컴파일을 가능하게 합니다.
      3. 컴파일러와 라이브러리 간 호환성:
        • 특정 컴파일러 버전과의 호환성을 위해 필요한 설정과 매크로를 정의합니다. 이는 MSVC 컴파일러와 표준 라이브러리가 일관되게 동작하도록 보장합니다.
      4. 디버깅 및 오류 처리:
        • 디버깅과 오류 처리를 돕기 위한 매크로와 설정을 포함합니다. 예를 들어, 디버그 모드에서 추가적인 검사나 로깅을 활성화할 수 있습니다.
      5. 플랫폼 특화 설정:
        • Windows 운영체제 및 다른 플랫폼 특화 설정을 포함하여, 표준 라이브러리가 다양한 환경에서 일관되게 동작할 수 있도록 합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.