13P by xguru 2023-07-13 | favorite | 댓글 2개
  • C++20을 잇는 차세대 C++ 표준
  • C++98, C++11, C++20 같은 게임 체인저는 아니고, C++17 수준의 작은 변화

(40년간의) C++표준 변화 알아보기

C++98

  • 80년대 말에 Bjarne Stroustrup 과 Margaret A. Ellis가 유명한 Annotated C++ Reference Manual (ARM) 책을 저술
  • 이 책의 목적은 두가지
    • 너무 많은 C++ 독립 구현체들이 있었기 때문에 ARM은 C++의 기능을 정의
    • C++ 표준인 C++98 (ISO/IEC 14882)의 기초가 됨
  • C++98은 몇몇 중요한 기능들을 포함
    • Templates
    • STL(Standard Template Library) : 컨테이너, 알고리듬, 스트링, IO Stream들을 포함

C++03

  • C++03 (14882:2003) 에서는 아주 작은 기술 수정이 이뤄짐
  • 커뮤니티에서는 C++98 을 포함한 C++03을 "레거시 C++" 이라고 부름

TR1

  • 2005년에 재미난 일이 생김. TR1(Technical Report 1)이 발간
  • TR1 은 C++11 을 위한 큰 발걸음이자 Modern C++로 향하는 첫걸음
  • C++ 표준 위원회 멤버들의 Boost 프로젝트에 기반
  • 차세대 C++ 표준에 들어갈 13개의 라이브러리를 포함 (정규식, 난수, std::shard_ptr 같은 스마트 포인터, 해쉬테이블등)

C++11

  • 다음 C++ 표준이었지만, 우린 Modern C++ 이라고 부름. 이 이름엔 C++14 와 C++17 을 포함
  • C++11 은 C++ 을 개발하는 방식을 완전히 바꿔버림
    • TR1의 컴포넌트 뿐만 아니라 move-semantic, perfect forwarding, variadic templates, constexpr 등을 가져옴
    • 스레딩 기반의 메모리 모델과 Threading API 가 포함

C++14

  • 작은 C++ 표준. read-writer locks, generalized 된 lambdas 와 constexpr 함수 도입

C++17

  • 크지도 작지도 않음
  • 2개의 뛰어난 기능을 포함 : Parallel STL 과 표준화된 파일시스템
    • 약 80개의 STL 알고리듬이 실행 정책을 통해 실행 가능 (병렬, 순차, 벡터)
  • Boost 에서 많이 영향을 받음. 파일 시스템과 3개의 데이터 타입(std::optional, std::variant, std::any)

C++20

  • C++20은 C++11과 마찬가지로 우리가 C++ 프로그래밍하는 것을 바꿔 버림
  • 특히 큰 4가지
    • Ranges : Ranges 라이브러리를 이용하면, 컨테이너에서 직접 알고리듬을 표한하고 파이프 기호로 알고리듬을 조합하여 무한 데이터 스트림에 적용 가능
    • Coroutines: C++에서 비동기 프로그래밍이 주류가 되게 해줌. 협동작업, 이벤트 루프, 무한 데이터 스트림 및 파이프라인의 기반이 됨
    • Concepts: 템플릿을 생각하고 프로그래밍 하는 방식을 바꿈. 템플릿 인자에 대해서 제약을 걸거나 타입 검사등을 할 수 있게 해주고, 컴파일시에 확인가능
    • Modules: 헤더 파일의 한계를 넘게 해줌. 다양한 것을 약속해줌. 예를 들어 전처리기가 필요없어지고, 궁극적으로 빌드 시간이 단축되고 패키지를 더 쉽게 빌드 할수 있게 됨

C++23

  • 2023년 7월 현재 C++23이 최종 투표를 앞두고 있음
  • 작지만 언어 자체에 매우 영향력 있는 기능인 "Deducing this"를 추가
    • 파이썬과 비슷하게, 멤버함수에 implicit하게 전달된 this 포인터를 explicit 할 수 있음
    • 이를 통해서 복잡한 테크닉인 CRTP(Curiously Recurring Template Pattern), 또는 Overload 패턴 구현이 간단해짐
  • C++23 라이브러에도 중요한 추가들이 있음
    • import std; 로 스탠다드 라이브러리를 직접 임포트 하거나, std:print 및 std:println 에서 C++20 포맷 스트링을 적용 가능
    • 성능상 std::map 을 대체하는 std::flat_map
    • std::optional 인터페이스가 Composability를 위해 Monadic 인터페이스로 확장됨
    • 새로운 데이터타입인 std::expected
    • 다차원 span 인 std::mdspan
    • 숫자들의 스트림을 생성하기 위한 코루틴인 std::generator

아직 네트워킹 표준 소식은 없나 보네요

다음표준에도;; 불확실하지않을까 싶습니다