C++ 0x draft 등장
프로그래밍 언어인 C++ 의 새 표준안인 C++ 0x의 초안(working draft)이 지난 9월 ISO C++ commitee에서 발행되었다. 실제로 이 초안을 가지고 토론 / 버그 픽스 / 모호한 부분의 수정을 거쳐 내년 이맘 때 최종안이 나온다고 한다.
C++ 98 때도 그렇지만 큰 수정은 아마 없을 것이고 , 최종안은 유료일테니 이걸 일단 가지고 있다 투표전 최종 드래프트를 보면 될법하다.
이제까지 알려진대로, template에서 특정 기능이 존재하는 타입임을 강제하는 concept 의 등장 같은 굵직한 변화 외에는 라이브러리 추가 등이 주가 된다. 일단 template 프로그래밍을 꽤 좋아하는 내 입장에선 concept이 가장 환영할만한 일이긴하다.
Concepts
Draft의 20.2 Concepts 에서 concept 을 정의하는데, 새로운 header <concept>
이 추가되었고, 이를 지원하기 위한 몇 가지 키워드(concept
, concept_map
… )이 C++ 표준에 추가된다. 그리고 이를 사용해서 현재 표준안(C++98)에서 단순히 타입 이름(흔히 T)를 써서 정의한 몇 가지 라이브러리들이 concept에서 지정하는 형태로 변경되었다.
예를 들어, <=
연산자를 정의할 때,
template <class T> bool operator<=(const T& x, const T& y); // C++ 98
template <LessThanComparable T> bool operator<=(const T& x, const T& y); // C++ 0x
위와 같이 형태가 변했다.
Multi-Thread Support
현재의 컴퓨터 구조를 잘 반영하여(사실 각종 플랫폼 의존적인 라이브러리로 커버 중이었지만), 멀티스레드 지원이 추가되었다. 개략적으로 따지면 원자적인 연산의 정의 / 스레드 지원 라이브러리가 추가되었다.
여기에는 다음과 같은 내용이 포함된다.
- 메모리 연산의 순서와 무모순성 문제: 참 골치아픈 문제지만, 이에 대한 몇 가지 정의를 한다. 하나의 공유된 메모리 공간을 쓰는 경우에 언제나 문제가 되는 메모리 읽기/쓰기 순서 재조정(reordering)과 관련된 제약 사항들을 얘기한다. 메모리 배리어(펜스) 관련된 사항들이나 순서에 대한 조금 풀린 제약 등도 다룬다.
- Lock-free 속성
- 원자적인 타입과 그에 대한 연산 –
<cstdatomic>
header 추가 - 원자적인 플래그 타입과 그에 대한 연산 (사실 위랑 좀 섞임)
각 OS/하드웨어 의존적이던 함수들 대신에
bool atomic_compare_exchange_weak(volatile atomic_itype*, integral*, integral);
bool atomic_compare_exchange_strong(volatile atomic_itype*, integral*, integral);
같은 형태의 표준적인 타입/연산을 쓰게 한다. (atomic_itype
은 일종의 template 타입임)
C++에서는 최초로, 표준으로 스레드를 정의했다. <thread>
, <mutex>
, <conditional_variable>
, <future>
header를 추가하고 각 header 이름에 걸맞는 기능들을 제공한다.
즉 스레드 자체를 만드는 법, 관리할 방법, 그리고 상호배제(mutex; mutual-exclusion)나 상호간의 통신을 위한 수단(conditional variable; wait or notify 류의 멤버들)을 제공한다. 특히 C++ 스러운 스레드 생성을 할 수 있는데,
template <class F, class …Args> thread(F&& f, Args&&… args);
같은 생성자를 쓸 수 있다.
<mutex>
쪽에선 lock과 mutex 그리고 call-once 를 제공한다. mutex/lock 은 현존하는 스레드 라이브러리의 super-set에 가까운 느낌. Win32나 posix 컨벤션의 mutex/lock 이 모두 등장한다.
<future>
는 다른 스레드 (혹은 자기 자신) 의 예외나 결과값을 차용해다가 쓰는 메커니즘을 제공하는데, 이런 류의 상대적으로 고수준 도구가 C++에 좀 추가될 필요성은 확실히 있다. C/C++ 코드로 작성된 MT 코드를 보다보면 저수준에서 생각해야하는게 너무 많거든.
Standard Library
TR1에 추가된 라이브러리 거의 대부분이 표준으로 유지되어 functional, tuple, regex, random 같은 반가운(?) header 를 계속 볼 수 있다. 유한한 유리수를 다루는 ratio 란 녀석도 존재한다.
ps. C++ 0x가 0x년에 나온다는 의미였는데, 내년 9월에 투표를 거쳐 나온다니 일단 0x가 되긴하는구나. 다만 C++ 09라는거…