C++ 0x draft 등장

Sutter’s Mill 에서 가져온 소식.

프로그래밍 언어인 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, classArgs> 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라는거…