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.com cppreference.com Null-terminated strings: byte − multibyte − wide en.cppreference.com
+ 세부 구현
- xmemory:
- xmemory는 C++ 표준 라이브러리의 일부로, 메모리 할당 및 해제를 관리하는 데 사용됩니다.
- 주로 컨테이너 (예: std::vector, std::map)의 내부 메모리 할당을 처리합니다.
코드에서 xmemory를 직접 사용하는 경우는 드뭅니다. 대신 컨테이너를 사용할 때 내부적으로 호출됩니다.
주요 기능
- 할당자(Allocators):
- xmemory는 표준 할당자 인터페이스를 구현합니다. 할당자는 컨테이너가 메모리를 요청할 때 사용하는 객체로, 메모리 할당 및 해제, 객체의 생성 및 소멸을 담당합니다.
- 표준 할당자 인터페이스는 std::allocator 클래스를 기반으로 하며, 사용자 정의 할당자를 구현할 때도 이를 기반으로 작성할 수 있습니다.
- 오브젝트의 생성과 소멸(Constructor/Destructor):
- xmemory는 메모리 블록에서 객체를 생성하고 소멸시키는 기능을 제공합니다. 이는 construct와 destroy 함수를 통해 이루어집니다.
- 메모리 초기화 및 복사(Memory Initialization and Copying):
- xmemory는 메모리 블록을 특정 값으로 초기화하거나 다른 블록으로 복사하는 기능을 제공합니다.
- 메모리 할당 정책:
- xmemory는 다양한 메모리 할당 정책을 구현하여, 특정 조건에서 메모리 할당 전략을 최적화할 수 있도록 합니다.
- 할당자(Allocators):
- yvals:
- yvals는 Visual Studio의 C++ 구현에서 사용되는 헤더 파일입니다.
- 주로 컴파일러 및 라이브러리 구현과 관련된 내부적인 세부 사항을 다룹니다.
보통 사용자가 직접 접근할 필요는 없습니다.
주요 기능
- 컴파일러 및 라이브러리 버전 정보:
- 이 파일은 MSVC 컴파일러와 표준 라이브러리의 버전 정보를 정의합니다. 이를 통해 코드에서 특정 버전에 맞춰 동작을 조정할 수 있습니다.
- 기능 플래그 설정:
- C++ 표준 라이브러리의 다양한 기능 플래그를 설정합니다. 예를 들어, 특정 C++ 표준 버전(C++11, C++14, C++17 등)에 따라 라이브러리 기능을 활성화하거나 비활성화합니다.
- 컴파일러가 지원하는 기능을 기준으로 조건부 컴파일을 가능하게 합니다.
- 컴파일러와 라이브러리 간 호환성:
- 특정 컴파일러 버전과의 호환성을 위해 필요한 설정과 매크로를 정의합니다. 이는 MSVC 컴파일러와 표준 라이브러리가 일관되게 동작하도록 보장합니다.
- 디버깅 및 오류 처리:
- 디버깅과 오류 처리를 돕기 위한 매크로와 설정을 포함합니다. 예를 들어, 디버그 모드에서 추가적인 검사나 로깅을 활성화할 수 있습니다.
- 플랫폼 특화 설정:
- Windows 운영체제 및 다른 플랫폼 특화 설정을 포함하여, 표준 라이브러리가 다양한 환경에서 일관되게 동작할 수 있도록 합니다.
- 컴파일러 및 라이브러리 버전 정보: