혹시 Boost 라이브러리라는 것을 아시나요? 만약 아직 모르고 있었다면 C++ 프로그래머로서 적지 않은 손해를
보고 있다고 생각합니다.^^
Boost 라이브러리는 C++
프로그래머를 위한 유용한 오픈 소스 C++ 라이브러리 모음입니다. Boost 라이브러리 개발에 수 많은 C++ 고급 프로그래머들이(C++ 표준 위원회 멤버 등) 참여 하고 있습니다. 그래서 Boost 라이브러리는 실용적인 기능과 높은 안정성을 가지고
있습니다.
만약 아직까지 Boost 라이브러리를 한번도 사용해 본적이 없다면
바로 사용하기를 권합니다. 그리고 아직도 일부에서는 Boost 라이브러리의
안정성에 대해서 의심하는 분들이 있는데 무의미한 의심은 그만두기를 바랍니다^^
C++11에 들어가는 새로운 표준 라이브러리에는 Boost 라이브러리에 있는 것들이 많이 들어갔습니다. 예를 들면 VS 2008 SP를 설치하면 사용할 수 있는 tr1 라이브러리에
있는 대부분이 Boost 라이브러리에 있는 것입니다. 새로운
표준에는 들어갔지만 아직 VC++에서 지원하지 않는 라이브러리도
Boost 라이브러리를 사용하면 미리 사용해볼 수 있습니다.
다음에 소개할 chrono도 Boost 라이브러리에 이미 있습니다. 그러니 Boost 라이브러리를 설치하면 chrono는 바로 사용해
볼 수 있습니다.
Boost 라이브러리의 설치와 사용 방법은 구글링을 하면 적지
않게 찾을 수 있습니다. 그 중 몇 개를 제가 찾아 놓았습니다^^
이메일 마케팅은 회사와 클라이언트 간의 관계의 모든 측면을 측정할 수있는 유일한 기회입니다. 이메일 마케팅은 중요한 벡터 생성 웹 트래픽입니다. 판촉 모델의 상단 목록에서 많은 마케팅 이메일 마케팅 장소. 사용하는 전자 메일 마케팅 무게 그룹이 직접적인 마케팅 캠페인을 이동됩니다 찾는 정확하게 구성되어 있습니다.
constexpr을 클래스에서 사용하면 클래스를 정수로 사용할
수도 있으며 메타 템플릿 프로그래밍에서는 이전에는 복잡하게 처리하던 것을 아주 간단하게 처리할 수도 있습니다. C++
메타 템플릿 프로그래밍에 관심이 많구나 자주 사용하고 있는 분들에게는 constexpr 덕분에
프로그래밍이 한결 편해지리라 생각합니다.
아래의 코드는 Integer 이라는 클래스를 constexpr을 사용하여 정수처럼 사용 합니다.
constexpr는 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있도록 해줍니다. 즉 상수로
취급할 수 있는 작업은 컴파일 타임에 처리하도록 할 수 있습니다.
constexpr를
변수에 사용
constexpr int aa = 11;
이것은
const int aa = 11
와 같은 의미를 가집니다.
그러나 아래와 같이는 사용할 수 없습니다.
int input_num = 0;
constexpr int aa = input_num; // 에러
constexpr로 지정된 변수는 꼭 컴파일 시에 정수가 되기
때문에 변수 선언 시 대입이 정수 식이어야만 합니다. const와의 차이는 const는 컴파일 시에 정수가 아니어도 괜찮고 변수 선언 시 대입 값이 정수 식인 경우 정수 식이 되고, 그렇지 않은 경우는 단순히 const를 수식하는 것이 됩니다(이에 비해 constexpr는 꼭 정수 식이어야만 합니다).
constexpr를
함수에 사용
C++03에서는 아래의 코드는 에러가 됩니다.
int GetNum() { retun 5; }
int Numbers[ GetNum() ];
GetNum 함수는 상수 5를
반환 하는 것으로 이미 컴파일 시에 반환 값을 알 수 있습니다. 그러나 컴파일러는 GetNum 이라는 함수가 정수처럼 사용할 수 있는지 알 수 없으므로 정수로 취급하지 않습니다.
위 코드는 C++11의 constexpr를
사용하면 우리가 원하는 대로 GetNum 함수를 정수로 사용할 수 있습니다.
constexpr int GetNum() { retun 5; }
int Numbers[ GetNum() ];
constexpr를
함수에 사용할 때는 꼭 함수 본체는 { return expression; } 형태가 되어야만 합니다.
constexpr 변수는 비 constexpr
변수에 사용할 수 있으므로 아래와 같은 테크닉도 사용할 수 있다.
constexpr double power( double x,
unsigned int y )
새로운 C++ 표준 작업이 언제쯤에나 끝날지 고대하고 있는 분들에게
반가운 소식이 있습니다.
드디어 C++0x 작업이 거의 마무리 되었습니다.
저번 주 수요일에 최종 국제 투표가 끝난 후 드디어 결과가 나왔는데 ‘만장 일치로 승인’이 되었습니다. 이제는 앞으로 몇 달 후에 ISO로부터 최종 발행만 기다리면 됩니다(즉 서류적인 절차만 남았습니다).
이로써 길게 길게 진행된 C++의 새로운 표준 작업은 끝나게 되어서
이제 C++11로 불리게 되었습니다( 이전에는 C++98, C++03이 있었습니다 ).
C++은 특정 회사가 주도하지 않고,
기존에 C++로 만들었던 코드가 문제 없이 동작해야 하고(표준
사양만 지켰다면), 성능과 편리성을 모두 가지려고 하니 많은 시간이 걸렸습니다.
아직 ISO에서 최종 문서가 나오지 않았고 무료로 최종 사양이 어떻게
되었는지 궁금한 분들은 http://t.co/5mjCzyJ를 통해서 문서를 받아보기 바랍니다. 이 문서는 워킹 드래프트 3242로 ISO에서
나올 사양 문서와 거의 같을 것입니다(참고로 ISO에서 나온
문서는 유료입니다).
이제 우리는 앞으로 나올 Visual C++이 과연 얼만큼 새로운
표준 기능을 구현해 줄지가 기대됩니다. 개인적으로 꽤 많은 부분이 구현되리라 생각하고 혹 빠진 부분은
예전의 tr1처럼 서비스 팩에서 구현되지 않을까 생각합니다.
C++ 새로운 표준이 정해졌으니 남보다 앞서기를 바라는 C++ 프로그래머들은 새로운 C++ 표준을 공부해 봅시다. ^^
근래에 바빠서 글을 거의 올리지 못했는데 다음 글은 새로운 C++ 표준의
바뀐 부분을 간단하게 설명하는 글을 올릴 예정입니다.
그리고 새로 추가되는 표준 라이브러리는 boost 라이브러리에서 많이 들어왔습니다. 그래서 지금이라도 boost 라이브러리를 다운로드 받으면 새로운
표준에 들어갈 라이브러리를 미리 사용할 수 있습니다.
지금 D2D1을 공부중입니다.
혹시나 해서 질문을 올려보는데요.
RanderTarge->DrawBitmap();//해주고
RanderTarge->SetTransform();//을 해주면 비트맵이 변화가 되서 나옵니다. 그런데 이때 궁금 한점이 여러장의 비트맵을 생성했을 경우 DrawBitmap에는 각각의 비트맵을 선택해서 생성을 할수가 있는데 SetTransform은 일괄적으로 바껴버리네요 이걸 어떻게 해야하는건가요???
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
AMP는 AcceleratedMassive Parallelism의 약자로 병렬 프로그래밍과 관련된 것입니다.
C++ AMP는 2주 전의 AMD의 Fusion 컨퍼런스에서Microsoft의 Herb Sutter씨가(MS의프로그램 언어 아키텍터 이자 C++ 표준 위원 멤버) 처음으로공개한 것으로 다음 버전의 Visual Studio(현재는Visual C++만)에서 GPGPU 프로그래밍환경을 제공하는 것을 뜻합니다.
병렬 프로그래밍에서 대해서 조금 깊게 공부하신 분들은 아마 GPGPU라는것을 들어본 적이 있으리라 생각합니다. GPGPU는 간단하게 말하자면 GPU를 CPU 처럼 사용하자라는 것으로 GPU의 높은 성능을 사용하여 CPU와 똑 같게는 사용할 수는 없지만연산 처리에서 높은 병렬 기능을 사용하여 CPU보다 훨씬 뛰어난 결과를 얻을 수 있습니다.
현재까지 GPGPU 개발환경은NVIDIA의 Cuda와 오픈 아키텍처인 OpenCL,DirectX 베이스의 DirectCompute가 있습니다.
GPGPU 프로그래밍의 단점은 프로그래밍이 복잡하고 아직 레퍼런스가적다는 단점이 있어서 아직은 일반적인 프로그래밍 영역에 들어오지 못하고 있습니다(사실 아직 일반 병렬프로그래밍도 쉽게 사용하지 못하고 있으니..). 그래서 GPGPU가나온 것은 몇 년이 지났지만 아직 일부 전문 영역에서만 사용되고 있었습니다.
그러나 CPU 아키텍처가 멀티코어에서 헤테로지니어스 아키텍처(이기종의 CPU가 결합.CPU+GPU등)로 서서히 넘어가고 있어서 자연스럽게GPGPU 프로그래밍이 부각되고 있었습니다. 하지만 아직도 개발환경의 뒷받침이 부족한 상태였는데드디어 우리 개발자에게 친숙한 Visual C++에서 이런 문제를 해결하려고 합니다.
C++ AMP는 쉽게 말하면Visual C++에서 GPGPU 프로그래밍을 지원하는 것을 말합니다. Visual C++의 뛰어난 개발환경을 토대로 하여 이때까지 복잡했던GPGPU 프로그래밍을 일반 프로그래밍 하듯이 사용할 수 있게 해줍니다. 이로써 GPGPU가 일반 프로그래밍 영역으로 들어 올 수 있는 큰 계기가 되었다고 생각합니다.
C++ AMP에 대해서 AMD의 Fusion 컨퍼런스에서 데모를 시연한 Daniel Moth의 블로그에올라온 글을 정리하면
개발자의 생산성과 이식성을 저해하지 않고 헤테로지니어스 하드웨어 프로그래밍의 허들을 낮게 하여 프로그래밍 일반영역에서 사용할 수 있도록 한다.
현재의 대 규모 병렬 하드웨어(CPU와 GPU)의 사용을 돕기 위한 것만이 아닌 코드의 투자를 미래에 대비한 디자인으로 하여 견고하도록 한다.
Visual Studio의 일부분으로 또 다른 컴파일러나 다른 구문을배울 필요가 없다.
현재의 C++ 언어를 사용하며 C나다른 파생 언어가 아니다.
Visual Studio vNext와 완벽하게 통합하여 지원한다. 편집, 빌드, 디버그, 프로파일러 등 Visual Studio의 다른 모든 기능이 C++ AMP와 같이 동작한다.
기존의 Concurrency Runtime의 일부로 STL와 비슷한 형태의 라이브러리를 제공하여 amp.h 헤더 파일을제공한다.
병렬화를 주 특징으로 하여 헤테로지니어스 하드웨어 위에서 거대한 다 차원 데이터를 아주 쉽게 동작한다.
유일의 코어 C++ 언어 확장을 도입한다.
DirectX(DirectCompute) 위에 구축하지만 C++ AMP에서는 DirectX의 모습은 나타나지 않는다(즉 DirectX를 몰라도 상관 없다).
또 동 세미나에서 기조 연설을 한 Herb Sutter씨의 강연 중 C++ AMP에 관한 내용으로는
C++ AMP에 의해서 기존의C++에서 큰 변경을 가하지 않으면서 언어를 확장하는 점을 강조하여 새로운 언어가 만들어서 개발자에게 혼란을 주는 것을 피했다라는것을 알림.
언어 확장으로 restrict() 함수와 array_view라는 2개의 type이 Key로 잡음. restrict()는 프로세서 아키텍처에 따라서 실행가능한 기능에 제한을 거는 것이고 array_view는 불 균인한 메모리 공간으로의 접근으로 생기는문제를 회피하기 위한 것으로 메모리 공간을 N 차원의 배열로서 작업하는 것을 뜻한다. 메모리 공간의 추상화라고 할 수도 있다. restrict()와 array_view는 프로세서 아키텍쳐와 메모리 공간의 차이를 흡수할 수 있는 것으로 C++ AMP의 중요한 Key이다.
C++ AMP의 컴파일러는Visual Studio의 차기 버전에서 들어갈 예정으로 릴리스는 이번 연말로 예상하고 있다. 또이 컴파일러는 오픈 사양일 예정으로 Windows 상의 VisualStudio 뿐만이 아닌 그 이외의 개발 환경(C++ Builder이나 이클립스 등)에서도 이용할 수 있도록 AMD와 협력 하여 개발 중이라고 한다.
DirectX의DirectCompute를 사용한다고 하니 C++ AMP를 사용한 프로그램은 Windows Vista 이상에서만 사용할 수 있을 것 같습니다(이유는 DirectCompute가 DirectX 10에서 지원하기 때문).
GPGPU에 관심은 있었지만 아직 시기상조라고 생각하는 분들은 C++ AMP가 나오면 개발 허들이 크게 내려가므로 본격적으로 준비를 해도 좋을 것 같습니다. AMD에서는 헤테로지니어스 컴퓨팅 프로그래밍의 전망을 CUDA 등의독자 사양에서 OpenCL이나 DirectCompute 등의오픈 사양으로 이동하고, 전문 프로그래머만 프로그래밍 하는 시대를2011년까지로 보고 그 이후로는 일반 프로그래머가 완전하게 C++로 프로그래밍하는 헤테로지니어스컴퓨팅 프로그램이 올 것으로 보고 있다고 합니다.
저도 이제 슬슬 GPGPU 프로그래밍 쪽으로 들어가볼 예정인데 일단조만간 OpenCL부터 시작해 볼까 합니다. 연말에 VS의 vNext가 나올 수도 있다고 하니 그때 꼭 C++ AMP를 공부해서 그 내용을 공유하도록 하겠습니다^^
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
앞에까지는 STL의 알고리즘에 추가된 것들을 다루었는데 이번에는
컨테이너 하나를 소개하겠습니다. 사실 이 컨테이너는 저도 얼마 전까지만 하더라도 새로 추가 된지 몰랐습니다.^^;
새로 추가된 컨테이너의 이름은 ‘forward_list’입니다.
이름을 들어보니 대충 어떤 컨테이너인지 감이 오시죠?^^ 네
이 컨테이너는 기존의 list 컨테이너와 비슷한 종류의 컨테이너입니다.
forward_list를 만든 이유
표준 라이브러리(STL)에는 이미 리스트(std::list) 라이브러리가 있습니다. 이것은 쌍 방향 리스트입니다. list는 사용하기는 편하지만 사용 메모리나 처리 속도에 조금 아쉬운 점이 있습니다. 또 대 부분의 상황에서 쌍 방향 리스트가 필요한 경우보다는 단 방향 리스트만으로 충분한 경우가 자주 있습니다. 이런 이유로 C++0x에서는 단 방향 리스트를 추가하기로 했습니다.
forward_list의 설계 방침
1. 특별한 이유가 없다면 forward_list는 기존의 list의 설계에 맞춘다.
2. 설계 상의 선택 기가 여러 개인 경우 성능(속도와 사이즈)을 최우선 한다(C의 구조체로 구현하는 경우와 비교하여 Zero Overhead로 한다).
3. std::list의
insert와 erase를 forward_list에서도
제공할 수 있지만 구현이 복잡해지고 성능 측면에서 좋지 않으므로 제공하지 않는다.
4. 다른 STL의 컨테이너들에 있는 size 함수를
제공하지 않는다. 이유는 요소 수를 보존하는 멤버를가지고 있으면 C언어에서
구현한 것과 비교해서 불필요한 메모리를 사용한다. 만약 이런 멤버를 가지고 있지 않으면서 size 함수를 지원하면 호출할 때마다 모든 요소를 세어야 하므로 계산량이 O(N)이
된다(그런데 유저는 다른 컨테이너와 같이 size의 계산량이
작을 것이라고 생각할 수 있다). 또 이미 unordered와
같은 연상 컨테이너도 기존의 요소를 만족하지 않고 있다.
STL의 list 컨테이너와 다른 점
forward_list는 기존의 list와 아래와 같은 점이 다릅니다.
1. forward_list는 단 방향 리스트(singly-linked-list)이다. 각 요소는 그 다음 요소를
가리키는 포인터를 하나만 가지고 있다(list은 양 방향 리스트).
2. (단 방향 리스트이므로)
list에 비해서 메모리를 작게 사용한다. 이것은 각 요소의 메모리만이 아닌 컨테이너 그
자체의 사이즈도 작다. int 형에 대해서 list는 12바이트라면 forward_list는 8바이트이다(64비트에서는 각각
24, 16).
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
2010에서 지원하던
Architecture tools의 기능을 강화하면서 새로운 기능을 추가
Native의 ALM에
투자를 하여 기존의 많은 ALM 기능을 Native에 대응해
나갈 것임
코드 분석
VS2010에서도 사용할 수 있는 기능으로 vNext에서 더욱 개선
상세한 정보를 전달하기 위해서 UI를 다시 디자인
분석 엔진 개선으로 더욱 강력하게 에러나 경고를 진단
제안을 클릭하면 코드 위에 하이라이트 하여 문제점을 가시화
Architecture
Tools (VS2010에서 지원)
Dependency diagram by binary
Native 애플리케이션의 아키텍처를 동적으로 시각화하여 의존
관계를 빠르게 파악할 수 있음
이름 공간, 타입, 함수 단위로 자유자재로 의존 관계를 시각화
Dependency diagram by include files
헤더 파일의 의존 관계도 그래프화(이 기능 사용하면 빌드 시간
단축을 위해 헤더 파일 정리할 때 정말 좋을 것 같습니다). 헤더 파일에 색을 붙여서 구분이 쉬워짐. 또 이미지 파일로 저장도 가능
Create a layer diagram and run
validation
기존 VS 프로젝트를 드래그&드랍으로
레이어 그림으로 변환. 아키텍처 검증과 의존 관계 생성도 할 수 있음.
아키텍처 검증은 TFS의 자동 빌드로 실행
그리고 드디어 vNext ALM for C++의 끝판왕 소개입니다.
.......
...........
..............
무려C++ Unit Test Framework 지원(뭐 사실 2010에서 닷넷은 이미 지원하고 있죠^^;;).
저는 이 기능은 정말 의외였습니다. 제가 tool에서 가장 지원해주기 바라는 기능이 드디어 들어오네요. 이
세션에서도 이 C++ Unit Test Framework 소개할 때 청중들의 박수갈채가 뿜어져 나왔다고
합니다. 아마 저도 이 세션을 들었으면 기립박수를 했을 것 같네요^^
이제 우리 C++ 프로그래머들도 이제 순정(?) Unit Test Framework을 사용할 수 있어 따로 설치하지 않아도 되고 녹색 버튼과 빨간 버튼을
볼 수 있습니다.
화면 멋지지 않나요? 저는 지금 회사에서 구글의 C++ Unit Test Framework를
사용하고 있는데 UI면에서는 비교를 할 수 없을 정도로 좋네요^^
단위 테스트 프로젝트 템플릿이 있고, CppUnitTest.h,
TEST_CLASS, TEST_METHOD 매크로가 있다고 합니다.
위 그림의 왼쪽이 Unit Test Explorer인데 테스트에
속성을 붙일 수 있는데 이 속성은 TEST_OWNER(), TEST_PRIORITY(),
TEST_IGNORE() 등이 있습니다.
Code Coverage
Unit Test Explorer에서 아이콘 클릭으로 코드 커버리지
데이터 리포트를 볼 수 있습니다.
바이너리 단위, 함수 단위로도 가능합니다. 원래 이 기능은 2010에는 있었지만 닷넷만 가능했죠. 이제 이것을 C++에서도 사용할 수 있습니다.
소스 코드의 하이라이트로 커버리지 상황을 시각화 할 수도 있습니다.
앞서 이야기 했듯이 기존에 닷넷만 지원하는 기능을 앞으로는 C++도
사용할 수 있습니다. 그리고 당연하게 vNext에서 새로
만들어지는 기능도 이젠 차별 없이 C++도 지원한다고 합니다.
vNext에서는 VS의 tool 기능을 반쪽만 아닌 닷넷과 같이 모두 사용할 수 있을 것 같아서 너무 좋네요^^
기억을 더듬어 보면 2008이 나오기 전 2007년 겨울에 MS 본사의
VC++ PM이 왔어 앞으로 VC++의 기능이 혁신적으로 개선 될 것이라고 했을 때 일종의
립 서비스라고 생각했고, 2008이 나왔을 때 역시나(물론
이전보다는 좀 좋아졌지만) 라고 생각했습니다. 그러나 2010이 나오면서 인텔리센스를 새로 만든 것을 보고 립 서비스가 아니었구나 라고 생각하게 되었고 이번 세션을
통해서 MS의 VC++에 대한 확고한 의지를 볼 수 있었습니다.
vNext가 정확하게 언제 나올지는 모르겠지만 VC++은 C++0x 기능과 C++
for ALM 기능으로 기대가 정말 많이 되고 나오면 공부할 것이 많을 것 같습니다.
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
너무 멋져요을 개봉된! 나는 필자 전에 이런 걸 배우는 가정 없다. 그래서이 주제에 대한 몇 가지 참신한 아이디어가있는 모든 사람을 찾을 수 좋네요. 정말이 일을 시작 주셔서 감사합니다. 이 웹 사이트는 약간 독창성과 웹, 누군가에 원한의 한 가지입니다. 웹에 새로운 것을 가져다 유용 직업!
댓글을 달아 주세요
You are completely right in such kind of technical points!
I was searching for such a guide! It is very much clear to me