[ VC11 ] 메모리를 절약하는 VC++11의 STL 컨테이너

Visual C++ 10 2012. 7. 9. 09:00 Posted by 알 수 없는 사용자

VC11 STL 컨테이너들은 이전 버전에 비해서 크기가 작아져서 메모리를 절약할 수 있게 되었습니다. 이전 버전과 다르게 VC11부터는 데스크탑 뿐만이 아닌 테블렛이나 스마트폰의 모바일 플랫폼 개발에서도 사용되므로 메모리 절약은 적지 않은 도움이 되리라 생각합니다.

 

아래 표는 x86(32비트 또는 ARM) x64(64비트) 플랫폼에서 각 VC 버전 별로 얼마만큼의 메모리를 사용하는 잘 표시하고 있습니다.

 

이 표는 VC11 뿐만이 아닌 이전 버전 사용자들에게도 도움이 될 것 같습니다. 저와 같은 서버 프로그래머들은 서버 프로그램이 설정한 동접자 수에서 어느 정도의 메모리를 소비할지 어느 정도 계산하고 있어야 하는데 이 표를 보면 메모리 계산할 때 도움이 될 것입니다

 

표의 바이트 사이즈는 Release 버전 기준입니다. 표에서 'VC9 SP1 SCL=0'SCL _SECURE_SCL를 뜻하는 것으로 원래 SCL은 기본은 1인데, 최고 스피드를 위해서 수동으로 SCL0으로 설정한 것입니다. VC10 VC11에서는 기본으로 _SECURE_SCL 0으로 되어 있습니다.

 



표의 출처는 MSDN입니다^^





[ VC11 ] 대격변(?) Visual C++ 11

Visual C++ 10 2012. 6. 25. 09:00 Posted by 알 수 없는 사용자

드디어 Visual Studio 2012(이하 VS2012) RC판이 나왔습니다(사실 꽤 되었죠^^;). 

이번 VS Visual C++(이하 VC++)의 버전은 11이 됩니다.

 

한동안 Visual C++은 변화가 거의 없다가 VC++ 9(VS 2008)에서 변화의 조짐을 보이다가 VS 2010에서 새로운 C++ 표준인 C++11(그 당시에는 C++0x라고 부름)과 병렬 프로그래밍, 툴의 기능 강화를 통해서 이전에 비해서 큰 변화를 이루었습니다.

또 이번 VS 2012에서도 VS 2010 버전 이상으로 큰 변화가 생겼습니다. 변화는 대격변이라고 부를 수 있을 정도입니다!.

 

 

이번에는 다음과 같은 변화가 있습니다.

 

1. Windows 8 Metro 앱 개발

아주 큰 변화 중의 하나입니다. 정식 제품이 가을쯤에 나올 Windows 8 Metro Windows Phone 8용 앱을 C++을 사용하여 개발할 수 있습니다. 이것을 위해 WinRT라는 새로운 플랫폼 API C++/CX가 새로 생겼습니다.

 

2. 툴 기능

다양한 C++ 토큰들에 다양한 색을 지정.

찾을 요소를 눈에 잘 뛰게 해준다.

편의 기능이 코딩 시 멤버 선택.

인텔리센스에서 C++/CLI 지원.

코드스니펫을 이용한 고속 코딩.

 

3. C++11 지원

이번에는 코어 언어 기능 보다는 라이브러리 기능이 더 중심이 되었습니다. 그러나 코어 언어에서 VC++ 10에서 큰 사랑을 받은 auto에 버금가는 range-based for loop가 있습니다. 그리고 라이브러리에 Thread가 추가 되었습니다. 이번에는 공부할 것이 많습니다 ^^;

 

4. 컴파일러 개선

CPU 개수에 맞추어 컴파일 속도가 향상.

Auto-Vectorizer 의한 프로그램 성능 향상.

 

5. 병렬 프로그래밍

기존의 병렬 라이브러리 개선.

새로운 디버깅 및 시각화 기능에 의해 쉽고 올바른 병렬 프로그래밍 진단.

GPU 병렬 프로그래밍을 위한 C++ AMP 추가.

 

6. 네이티브 유닛테스트 프레임웍 추가

사제가 아닌 마이크로소프트 순정의 유닛테스트 프레임웍!!!.

 

 

 

이렇게 VC++ 11의 새로운 기능을 정리해 보았습니다. 제가 대충 큰 것만 정리했는데도 공부할 것이 많지 않습니까?^^; 한번에 다 하면 부담되지만 조금씩 하면 충분히 공부할만한 분량입니다. 아직 정식 버전이 나오지 않았으니(가을쯤에 나온다고 합니다) 여유를 가지고 지금부터 조금씩 천천히 공부해 보죠^^

 

 

 

 

 

ps 1: VC++의 각 버전 별 내부 버전 번호와 코드에 정의된 버전

브랜드 버전                  내부 버전          #define _MSC_VER 버전

Visual C++ 2005            VC8                 1400

Visual C++ 2008            VC9                 1500

Visual C++ 2010            VC10                1600

Visual C++ 2012            VC11                1700

 

 

ps 2: 실행 환경

위에는 VC++11의 좋은 점만 이야기 했지만 개인적으로 걱정되는 것이 있습니다. 가장 큰 문제가 실행 환경입니다. VC++11Windows Vista 이상에서만 실행되고 또 VC++11을 이용해서 만든 프로그램도  Windows Vista  이상에서만 실행할 수 있습니다.

Windows 8 Metro 앱 개발을 하거나 저처럼 서버 개발을 하는 개발자에게는 큰 문제가 되지 않을 수도 있지만 클라이언트 개발자에게는 이 부분이 VC++11을 사용하는데 큰 걸림돌이 되리라 생각합니다

 => 그런데 VC++ 팀블로그를 보니 많은 고객들이 XP 지원을 요청해서 가을쯤에 업데이트를 통해서 XP도 지원해 준다고 합니다.^^ 

http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320645.aspx

이로써 큰 고민을 하나 해결 되었네요^^

 

Visual C++ 10에서 디버깅하기

Visual C++ 10 2012. 4. 25. 00:28 Posted by 알 수 없는 사용자

예전에 Visual C++ 10과 관련된 책을 집필할 계획이 있어서 그때 작성한 글인데 책 출간 계획이 사라졌으므로(한참 전에)

그냥 공개합니다. 글은 초보자를 타겟으로 하고 있으며 Visula C++ 10의 디버깅 기능을 설명하고 있습니다.


도움이 되었으면 좋겠습니다^^



6장 디버깅.pdf


문서를 동의 없이 수정하지 않고, 출처만 남겨 주신다면 문서는 마음대로 배포하셔도 괜찮습니다^^


Visual C++ 11 베타 출시!!!

Visual C++ 10 2012. 3. 3. 09:00 Posted by 알 수 없는 사용자

드디어 (미국 시간)2 29일에 Windows 8 Consumer Preview과 함께 Visual Studio 11 베타 버전이 나왔습니다.

저는 31일 새벽에 다운로드 받은 후 그날 저녁쯤에 설치를 했습니다.

일단 OS와 툴 둘 다 베타 버전이라서 편의성을 위해서 VirtualBox에 설치를 했습니다.

 

설치를 하면서 저는 C++ 프로그래머답게 Visual C++ 11(VC++11) 10에 비교해서 어떤 변화가 있는지 찾아 보았습니다.

 

결론부터 말하면 C++11 부분은 CPT 버전이 나왔을 때 보다는 좋아졌지만 아직은 살짝 아쉬운 부분이 있으며 전체적으로 VC++11 10에 비해서 많은 변화가 생겼습니다(다른 말로 말하면 공부할게 많아졌습니다^^;).

MSDN에 소개된 글을 보면 VC++11의 특징은 크게 4개로 나눌 수 있습니다.

 

 

 

C++11 지원 강화

STL

새롭게 추가된 STL 라이브러리

<atomic>, <chrono>, <condition_variable>, <filesystem>, <future>, <mutex>, <ratio>, <thread>

가장 눈에 띄는 것은 스레드 관련 라이브러리입니다.

 

 

컨테이너의 메모리 최적화

vector은 기존 16바이트에서 12바이트, map 16바이트에서 8바이트로 축소

 

 

모든 컨테이너에 Emplacement 함수 구현

 

 

 

코어 언어

range-based for-loop, override/final, 강한 형 타입 및 전방 선언 enums

VC++10에서 정말 많은 사랑을 받는 것 중의 하나가 auto라면 이번 VC++11에서는 range-based for-loop라고 생각합니다. 이것은 배열이나 컨테이너들을 사용할 때 편리한데 아래와 같이 사용할 수 있습니다.

 

int Numbers[3] = { 1, 2, 3 };

for( int &n : Numbers )

{

   std::cout << n << std::endl;

}

 

바로 for( int &n : Numbers ) 부분이 range-based for-loop 인데 보면 알 수 있듯이 편리와 안전 둘 다를 잡을 수 있습니다.

 

 

Variadic Templates

Variadic Templates은 가변 길이 인수 템플릿으로 현재는 올바르게 지원하는 것은 아닙니다. 현재는 매크로를 사용하여 임시적으로 구현되어 있습니다. 기본으로는 최대 5개까지 지원하고 _VARIADIC_MAX 라는 매크로의 값을 변경하면 최대 10개까지 늘릴 수 있습니다.

 

 

Stateless lambda

변수를 캡쳐하지 않는 람다 식은 함수 포인터로 변환할 수 있다 라는 사양이 C++ 11에 추가되었는데 이것을 MS에서는 Stateless lambda라고 부릅니다. 이것을 사용하면 Windows 프로시저의 콜백 함수에 람다 식을 사용할 수 있습니다.

 

 

 

WinRT 지원

Windows 8 개발과 관계가 있는 부분입니다.

Windows 8 Metro 스타일과 데스크 탑 스타일 두 개의 모드를 지원하는데 데스크 탑 모드는 현재 우리가 사용하고 있는 것과 동일한 것이고 Metro 스타일은 테블릿을 위한 모드입니다.

Metro에서 만드는 비 관리형 C++ 코드는 WinRT를 사용합니다.

UI XAML을 사용하고 C++ Component Extensions(C++/CX)을 사용하여 닷넷을 경계의 구분 없이 사용할 수 있습니다

VC++ 프로젝트 템플릿을 보면 WinRT와 관련된 것이 새로 많이 생겼습니다. 위 그림의 Direct2D Application이나 Direct3D Application은 모두 WinRT용입니다.

 

 

병렬 프로그래밍

새로운 병렬 알고리즘 추가 - parallel_sort, parallel_reduce, parallel_transform

 

새로운 병렬 컨테이너 추가 – priority_queue, map 등 추가

 

스케쥴러 기능 향상

 

C++ AMP – CUDA와 비슷한 GPU를 사용한 병렬 프로그래밍. DirectX 11 Direct Compute가 개량 되었다고 생각해도 좋을 것 같습니다.

 

 

 

향상된 IDE

코드 분석 기능 강화

 

더 똑똑해진 인텔리센스

 

네이티브 C++도 유닛테스트 지원

 

코드 커버리지 기능 지원

 

 

 

 

 

베타 버전이 나왔고 흥미로운 것들이 많아서 저는 조금씩 조금씩 VC++ 11의 새로운 부분을 공부해 나가려고 합니다. 이전처럼 공부한 것들을 여기에 정리해서 올릴 예정이니 관심 있는 분들은 같이 공부해 나가기 바랍니다^^

 

 

 

참고

What's New in Visual Studio 11 Beta for C++ Developers

http://blogs.msdn.com/b/vcblog/archive/2012/02/29/10272778.aspx

 

MSDN VC++11

http://msdn.microsoft.com/ko-kr/library/hh409293%28v=vs.110%29.aspx

 

 

Windows 8에서의 개발 개념

http://jacking.tistory.com/887

 

Windows Runtime(WinRT)에서 사용하는 C++ Component Extensions(C++/CX)?

http://jacking.tistory.com/888

C++ AMP

Visual C++ 10 2011. 6. 28. 09:00 Posted by 알 수 없는 사용자

C++ AMP라는 것을 들어보셨나요?근래에 나온 단어입니다.

AMP AcceleratedMassive Parallelism의 약자로 병렬 프로그래밍과 관련된 것입니다.

 

C++ AMP 2주 전의 AMD Fusion 컨퍼런스에서MicrosoftHerb 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와 협력 하여 개발 중이라고 한다.

 

 

 

 

 

DirectXDirectCompute를 사용한다고 하니 C++ AMP를 사용한 프로그램은 Windows Vista 이상에서만 사용할 수 있을 것 같습니다(이유는 DirectCompute DirectX 10에서 지원하기 때문).

 

GPGPU에 관심은 있었지만 아직 시기상조라고 생각하는 분들은 C++ AMP가 나오면 개발 허들이 크게 내려가므로 본격적으로 준비를 해도 좋을 것 같습니다. AMD에서는 헤테로지니어스 컴퓨팅 프로그래밍의 전망을 CUDA 등의독자 사양에서 OpenCL이나 DirectCompute 등의오픈 사양으로 이동하고, 전문 프로그래머만 프로그래밍 하는 시대를2011년까지로 보고 그 이후로는 일반 프로그래머가 완전하게 C++로 프로그래밍하는 헤테로지니어스컴퓨팅 프로그램이 올 것으로 보고 있다고 합니다.

 

저도 이제 슬슬 GPGPU 프로그래밍 쪽으로 들어가볼 예정인데 일단조만간 OpenCL부터 시작해 볼까 합니다. 연말에 VS vNext가 나올 수도 있다고 하니 그때 꼭 C++ AMP를 공부해서 그 내용을 공유하도록 하겠습니다^^

 

 

 

참고

헤테로지니어스 멀티 코어 http://jacking.tistory.com/513

 

Daniel Moth씨의 블로그 http://www.danielmoth.com/Blog/

  위 글을 정리한 한블로그(일본어)
 http://blogs.msdn.com/b/hiroyuk/archive/2011/06/20/10176783.aspx

 

AMD Fusion 컨퍼런스에서의 데모

비디오 http://channel9.msdn.com/posts/Daniel-Moth-Blazing-fast-code-using-GPUs-and-more-with-C-AMP

슬라이드 http://ecn.channel9.msdn.com/content/DanielMoth_CppAMP_Intro.pdf

 

일본의 임프레스 사이트에 올라온 Herb Sutter씨의 기존 강연정리 글

http://pc.watch.impress.co.jp/docs/news/event/20110617_453939.html

 

미국에서 개최된 TechEd 2011의 강연 중에서 VC++과 관련이 있는 ALM for C++ in Microsoft Visual Studio 2010이라는 세션을 소개하려고 합니다.

 

이 세션의 내용은 Visual Studio 2010(이하 VS)에서 C++에서 사용할 있는 ALM 기능을 소개하고, VS의 차기 버전(이하 vNext) 구현될 ALM 기능을 소개하고 있습니다.

사실 저는 이 세션에 대해서 별로 기대하지 않았습니다. 그러나 세션 내용을 보니 저의 생각을 완전히 뛰어 넘었습니다. VS의 차기 버전을 많이 기대하게 되었습니다.^^
이 세션의 내용 중 vNext에 관련된 내용을 정리해 보았습니다.

 

이 세션의 내용을 짧게 정리하면 기존 VS에서 닷넷만 되고 C++은 안 되는 기능을 이제는 C++에도 동등하게 지원한다’ 입니다.

저는 Visual Studio.NET 2002에서부터 VS에 대한 불만 중 하나가 닷넷 프로그래머나 C++ 프로그래머나 똑 같은 돈을 주고 VS를 구입하는데 왜 tool의 많은 기능 중 닷넷만 되고 C++은 안 되냐라는 것이었는데 이제 이런 불만이 사라질 것 같습니다.

 

그럼 ‘ALM for C++ in Microsoft Visual Studio 2010’ 세션을 간단하게 소개하겠습니다.

( 본문에 사용한 그림은 VC++ 팀 블로그에 올라온 그림을 사용하였습니다 )

 

현재 C++에서 VS ALM을 모두 사용하고 있는 사람은 3할정도

 

Visual Studio 2010에서의 ALM 기능

Premium 버전

- ALM과 관련된 기능으로 Code Coverage, Static Analysis, Profiling, Concurrency Profiling을 지원.

Ultimate 버전

- Load Testing, Lab Menagement 지원

- TFS에서는 Version Control, Team Build 지원

 

 

vNext에서의 변화

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 기능으로 기대가 정말 많이 되고 나오면 공부할 것이 많을 것 같습니다.

 

‘ALM for C++ in Microsoft Visual Studio 2010’ 세션에 대한 정보는 VC++ 팀 블로그의 글이나 Channel 9에서 영상으로 볼 수 있습니다.

 

 

[SafeInt] C++에서 안전한 정수 연산을 하자 - 4

Visual C++ 10 2011. 3. 7. 09:00 Posted by 알 수 없는 사용자

이번이 SafeInt 라이브러리에 대한 4번째 글이면서 마지막 글입니다. 이전 회의 제 글을 보셨다면 SafeInt가 어떤 것인지, 어떻게 사용하는지 대부분 알게 되셨습니다. 이번에는 SafeInt의 함수 버전에 대해서 설명합니다.

 

 

SafeInt 함수

SafeInt 라이브러리에는 SafeInt 클래스의 인스턴스를 만들지 않고 사용할 수 있도록 몇 개의 함수를 지원하고 있습니다. SafeInt 함수는 정수 오버플로우가 발생하지 않도록 단일 수치 연산을 보호하고 싶을 때 사용합니다. 그리고 복수의 수치 연산을 보호하고 싶을 때는 SafeInt 클래스를 사용하고 함수 버전들을 반복하여 사용하는 것보다는 SafeInt 클래스를 사용하는 것이 더 효율적이라고 합니다.

 

함수

설명

SafeAdd

두 개의 값을 더한다

SafeCast

다른 형으로 캐스팅한다

SafeDivide

두 개의 값으로 나눈다

SafeEquals, SafeGreaterThan, SafeGreaterThanEquals, SafeLessThan, SafeLessThanEquals, SafeNotEquals

2개의 값을 비교한다. 이 함수들을 사용하면 서로 형이 다른 두 개의 값을 형 변환하지 않고 비교할 수 있다

SafeModulus

나머지를 구한다

SafeMultiply

두 개의 값을 곱한다

SafeSubtract

두 개의 값을 뺀다.

 

 

함수들의 이름만 봐도 어떤 것인지 알 수 있고, 이미 어떤 역할을 하는지 아실 테니 따로 길게 설명은 하지 않겠습니다. 아주 간단한 예제를 보여드릴 테니 그것을 보고 대충 어떻게 사용하는지 이해하고 부족한 부분은 MSDN을 참고해 주세요

 

#include <iostream>

#include <safeint.h>

using namespace msl::utilities;

 

 

int main()

{

           unsigned char X1 = 123;

           unsigned char X2 = 200;

           unsigned char X3 = 0;

           if( false == SafeAdd( X1, X2, X3 ) ) {

                     std::cout << "Overflow 발생!!" << std::endl;

           }

          

           unsigned int AA = 100;

           short BB = 101;

           if( false == SafeEquals( AA, BB ) ) {

                     std::cout << "AA BB는 서로 다릅니다" << std::endl;

           }

 

           getchar();

           return 0;

}

< 결과 >


 

 


참고

SafeInt 함수

http://msdn.microsoft.com/ko-kr/library/dd575188.aspx

 

[SafeInt] C++에서 안전한 정수 연산을 하자 - 3

Visual C++ 10 2011. 3. 2. 09:00 Posted by 알 수 없는 사용자

SafeInt의 예외처리 두 번째 방법은 기본 예외처리 정책을 컴파일 타임에서 선언하는 것입니다.

앞 글에서 우리가 만든 예외처리 클래스를 사용하기 위해 SafeInt를 정의할 때 예외처리 클래스를 템플릿 파라미터의 인자로 넘겼는데 이번에 소개하는 방법은 이 예외처리 클래스 템플릿 인자를 미리 정의해 놓는 것입니다.

 

방법은 SafeInt 헤더파일을 선언하기 전에 #define 문으로 _SAFEINT_DEFAULT_ERROR_POLICY에 예외처리에 사용할 클래스를 선언합니다.

 

// MySafeIntException 이 우리가 정의한 예외처리 클래스입니다.

#define _SAFEINT_DEFAULT_ERROR_POLICY MySafeIntException

 

#include <safeint.h>

 

이렇게 #define 문으로 SafeInt에서 사용할 예외처리 클래스를 선언하고 예외처리 클래스를 정의하면 SafeInt를 선언할 때 템플릿 파라미터로 형만 선언하면 이후 SafeInt를 사용하다가 예외가 발생하면 #define에서 선언한 예외처리 클래스를 호출합니다.

 

#include <iostream>

#define _SAFEINT_DEFAULT_ERROR_POLICY MySafeIntException

 

#include <safeint.h>

using namespace msl::utilities;

 

 

class MySafeIntException : public SafeIntException

{

public:

           static void SafeIntOnOverflow()

           {

                     std::cout << "Overflow 발생!!" << std::endl;

           }

 

           static void SafeIntOnDivZero()

           {

                     std::cout << "0으로 나누기 발생!!" << std::endl;

           }

};

 

 

int main()

{

           SafeInt<unsigned int> X1(1234567);

           SafeInt<unsigned int> X2(1234567);

          

           SafeInt<unsigned int> X3 = X1 * X2;

          

           getchar();

           return 0;

}

 

이전 회에서 소개한 방법과 별 차이 없이 #define 문을 사용한다는 것만 다르니 쉽게 이해했으리라 생각합니다.

 

이제 SafeInt를 사용할 때는 예외처리를 위해 우리는 3가지 방식을 사용할 수 있습니다,

1. try{} catch{}

2. SafeInt에서 사용할 예외처리 클래스를 정의 후 SafeInt 선언 시에 사용

3. #define 문을 사용하여 SafeInt에서 사용할 기본 예외처리 클래스 선언

 

SafeInt 라이브러리는 클래스만 있는 것이 아닙니다. 함수로도 지원합니다. SafeInt의 함수 버전은 SafeInt에 대한 마지막 글이 될 다음 포스팅을 통해서 설명하겠습니다.

 

[SafeInt] C++에서 안전한 정수 연산을 하자 - 2

Visual C++ 10 2011. 2. 22. 09:00 Posted by 알 수 없는 사용자

이전 글에서 SafeInt를 사용하여 정수 연상을 할 때 오버플로우가 발생할 때 예외처리를 하지 않으면 릴리즈 모드에서는 크래쉬가 발생한다고 하였습니다. 그래서 SafeInt를 사용할 때 꼭 예외처리를 사용해야 합니다.

 

< 코드 1. SafeInt 연산 시 예외처리 구현 >

#include <iostream>

#include <safeint.h>

 using namespace msl::utilities;

 

int main()

{

           SafeInt<unsigned int> X1(1234567);

           SafeInt<unsigned int> X2(1234567);

          

           try

           {

                     SafeInt<unsigned int> X3 = X1 * X2;

           }

           catch(SafeIntException e)

           {

                     std::cout << "overflow!!. ErrorCode : " << e.m_code << std::endl;

           }

 

           getchar();

           return 0;

}

 

< 결과 >

 

 <코드 1>의 결과를 보면 예외 처리에 의해서 프로그램이 크래쉬 되지 않음을 알 수 있습니다. 그런데 SafeInt를 사용할 때마다 <코드1> 처럼 매번 예외처리를 구현한다는 것은 너무 불편합니다. 불편하면 SafeInt를 기피하게 되겠죠. -_-

다행히 SafeInt는 이런 것도 다 감안해서 만들어져 있습니다. 사전에 예외처리를 미리 정의 해 놓으면 매번 예외처리를 정의할 필요가 없습니다.

SafeInt의 예외처리 정의는 두 가지 방법이 있습니다. 이번 회는 두 가지 방법 중 첫 번째 방법을 소개하고 두 번째 것은 다음 회에 소개 하겠습니다.

 

 

 

SafeInt의 예외처리 방법 1

SafeInt의 기본 예외 처리 클래스를 상속 받아서 우리가 원하는 방식으로 정의한 후 그것을 SafeInt의 생성자에 인자로 넘겨주면 SafeInt로 연산 작업을 할 때 예외가 발생하면 우리가 정의한 예외처리를 호출합니다. 백문이불여일견이라고 바로 다음의 코드를 봐 주세요. 아주 간단합니다.

 

< 코드 2. SafeInt의 예외처리 방법 1 >

#include <iostream>
#include <safeint.h>

using namespace msl::utilities;

 

class MySafeIntException : public SafeIntException

{

public:

           static void SafeIntOnOverflow()

           {

                     std::cout << "Overflow 발생!!" << std::endl;

           }

 

           static void SafeIntOnDivZero()

           {

                     std::cout << "0으로 나누기 발생!!" << std::endl;

           }

};

 

int main()

{

           SafeInt<unsigned int, MySafeIntException> X1(1234567);

           SafeInt<unsigned int, MySafeIntException> X2(1234567);

          

           SafeInt<unsigned int, MySafeIntException> X3 = X1 * X2;

          

           getchar();

           return 0;

}

 

< 결과 >

 

 <코드 2>의 결과를 보면 SafeInt로 연산 작업을 할 때 예외처리를 같이 정의하지 않아도 오버플로우로가 발생하면 우리가 정의한 클래스의 멤버 함수를 호출 합니다.

 

SafeInt의 생성자에 인자로 넘기는 예외처리 클래스는 꼭 SafeIntException 클래스를 상속 받고 static void SafeIntOnOverflow()static void SafeIntOnDivZero()를 재정의해야 합니다.

 

이것으로 <코드 1>의 예외처리 방식보다는 좀 편리해졌습니다. 그런데 아마 지금도 마음에 들지 않는 분이 있을 것 같습니다. SafeInt를 생성 할 때마다 매번 예외처리 클래스를 인자로 넘기는 것도 귀찮은 분이 있을 것 같네요. 이런 분들을 위해서 SafeInt는 또 하나더 예외처리 방법을 지원합니다. 그것은 다음 회에서 설명하겠습니다.^^

[SafeInt] C++에서 안전한 정수 연산을 하자 - 1

Visual C++ 10 2011. 2. 14. 09:00 Posted by 알 수 없는 사용자
#include <iostream> 

int main()

{

           unsigned int X1 = 1234567;

           unsigned int X2 = 1234567;

           unsigned int X3 = X1 * X2;

           std::cout << "X3 = " << X3 << std::endl;

 

           unsigned __int64 BigX1 = 1234567;

           unsigned __int64 BigX2 = 1234567;

           unsigned __int64 BigX3 = BigX1 * BigX2;

           std::cout << "BigX3 = " << BigX3 << std::endl;

 

           getchar();

           return 0;

}

 

<코드1>를 실행하면 변수 X3 BigX3의 값이 서로 같을까요? 혹시 같다고 생각하시는 분들은 unsigned int의 최대 값이 얼마인지 MSDN에서 검색해 보세요... 네 결과는 서로 다릅니다. 둘 다 계산에 사용하는 값은 같지만 결과가 다르게 나오는 이유는 unsigned int로는 X1 X2를 곱해서 나온 값을 보관할 수 없기 때문입니다. X3 = X1 * X2에서 X3는 오버플로우가 발생하여 상위 비트가 삭제되어 올바른 계산 값이 저장되지 않습니다.

 

<코드 1의 결과>


 

<코드 1>의 코드는 사실 별로 길지 않은 코드이기 때문에 실행하기 전에 오버플로우가 발생하리라는 것을 충분히 예상할 수 있고, 혹은 실행 후에 X3의 값이 예상하지 못한 값이 들어가 있어도 문제를 쉽게 파악할 수 있을 것입니다. 그러나 우리가 만드는 애플리케이션은 복잡하고 긴 코드를 가지고 있습니다. <코드 1>과 같은 오버플로우에 의해서 버그가 발생하면 쉽게 버그를 찾기 힘들고 특히 오버플로우에 의해 애플리케이션이 오 동작하여 크래쉬가 발생할 수도 있습니다.

 

안전한 애플리케이션을 만들기 위해서는 안전한 코드를 만들어야 합니다. 보통 안전한 코드를 생각하면 포인터 조작과 문자열 조작을 주로 중요하게 다루고 VC++에서도 안전한 문자열 조작 위해 ‘_s’가 붙은 문자열 조작함수를 사용하도록 VC++에서 종용하고 있어서 요즘은 대 부분 이것을 사용하고 있습니다. 그러나 정수 계산에 대해서는 안전한 코드를 위해 지원해 주는 것이 없었습니다.

 


SafeInt 란?

VC++ 10에서는 안전한 정수 계산을 위해서 새로운 라이브러리를 지원해 줍니다. 이 라이브러리의 이름은 SafeInt 입니다. SafeIntC++의 템플릿으로 만들어서 char 형에서 __int64 형까지 8비트에서 64비트 사이의 크기를 가진 모든 정수 형을 사용할 수 있습니다.

SafeInt 라이브러리를 사용하면 결과를 담을 변수의 형 보다 큰 정수 값 연산을 하거나 0으로 나누기 연산을 할 때 발생하는 오버플로우를 감지 할 수 있습니다.


 

SafeInt 사용

SafeInt를 사용하기 위해서는 헤더 파일 safeint.h 를 포함하고 msl::utilities 이름 공간을 선언해야 합니다.


 < 코드 2 >

#include <iostream>

#include <safeint.h>

using namespace msl::utilities;

 

int main()

{

           SafeInt<unsigned int> X1(1234567);

          

           unsigned int x2 = 1234567;

           SafeInt<unsigned int> X2(x2);


           SafeInt<unsigned int> X3 = X1 * X2;     

        

           getchar();

           return 0;

}

 

<코드 2>를 디버그 모드에서 실행하면 아래와 같은 ASSERT 메시지가 발생합니다.


 

이유는 오버플로우가 발생했기 때문입니다. 그러나 릴리즈 모드에서는 ASSERT 메시지가 발생하지 않습니다. 다만 크래쉬가 발생합니다. -_-;;

오버플로우에 의해서 디버그 모드에서는 ASSERT 메시지, 릴리즈 모드에서는 크래쉬가 발생하는 이유는

SafeInt<unsigned int> X3 = X1 * X2;

에서 예외가 발생하기 됩니다. SafeInt를 사용하는 경우 오버플로우가 발생하면 예외를 발생시키기 때문에 try{} catch{}로 예외를 처리해 주지 않으면 안됩니다. 예외 처리가 올바르게 하면 오버플로우가 발생했을 때 발생하는 문제를 올바르게 대처하던가 어디에서 어떻게 오버플로우가 발생했는지 쉽게 알 수 있습니다.

 

그리고 SafeInt는 일반 정수형과 같이 연산을 할 수도 있다.

<코드 3>

#include <iostream>

#include <safeint.h>

 

using namespace msl::utilities;

 

int main()

{

           SafeInt<unsigned int> X1(1234567);

          

           unsigned int X2 = 123;

           SafeInt<unsigned int> X3 = X1 * X2;

          

           getchar();

           return 0;

}


 

이번 회에는 간단하게 정수 연산 시의 오버플로우 문제와 SafeInt가 무엇인지, SafeInt의 간단한 사용 방법만 설명하였습니다.

다음 회는 <코드 2>에서 발생하는 예외를 어떻게 처리하는지 설명하겠습니다.

 

VS2010 C++ 프로젝트의 디렉토리 설정

Visual C++ 10 2010. 8. 9. 09:00 Posted by 알 수 없는 사용자

VS2008까지는 도구’ – ‘옵션메뉴를 통해서 VC++ 디렉토리를 설정하였습니다.

이렇게 설정한 정보는 모든 VC++ 프로젝트에 적용됩니다.

 

그러나 VS2010에서는 각 프로젝트 별로 VC++ 디렉토리를 설정합니다.

 


각 프로젝트 마다 독립적으로 설정을 할 수 있어서 편한 부분도 있지만 때로는 모든 프로젝트에 공통적으로 적용되어야 하는 경우는 매번 설정하는 것이 귀찮을 수 있습니다.

( 예로 DirectX boost 라이브러리 등 )

 

이런 경우 속성 매니저를 통해서 VC++ 디렉토리를 설정하면 모든 프로젝트에 공통적으로 적용할 수 있습니다.

 

1. 일단 아무 프로젝트 하나를 열어 놓습니다.

2. 메뉴의 보기’ -> ‘속성 관리자를 선택합니다.



3. 속성 관리자에서 ‘Microsoft.Cpp.Win32.user’를 더블 클릭해서 열어 놓습니다.


 

여기서 설정한 정보는 모든 프로젝트에 공통적으로 적용됩니다.

 

 

[Upgrade to VC++ 10] _WIN32_WINNT 버전 문제

Visual C++ 10 2010. 8. 2. 09:00 Posted by 알 수 없는 사용자

VS.NET(VS2002)에서 MFC 프로젝트로 만들었던 프로그램을 VC++10 프로젝트로 변환하여 컴파일 했더니 에러가 발생하면서 아래의 경고가 나왔습니다.

 

C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcore.h(35):#error This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.

 

에러 내용은 프로젝트에서 정의된 _WIN32_WINNT 버전이 0x403인데 atlcore.h 버전이 최소 0x0501 이상이 되어야 한다는 것입니다.

 

그래서 _WIN32_WINN 정의한 stdafx.h 파일을 열어보니

#define _WIN32_WINNT 0x0400

되어 있었더군요. 그래서 일단 이것을 최신이 좋다라는 생각에 아래와 같이 했습니다. ^^;;

#define _WIN32_WINNT 0x0600

 

그랬더니 이제는 아래와 같은 에러가 나오더군요. -_-;

c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxcmn3.inl(29): error C2065: 'CCM_SETWINDOWTHEME' : 선언되지 않은 식별자입니다.

 

그래서 바로 구글링 들어갔습니다.

쉽게 저와 같은 에러가 나와서 질문을 올린 글을 찾았고 답변도 보았습니다.

문제 해결은 stdafx.h 파일에 정의된 버전의 숫자를 아래와 같이 하면 된다고 하더군요

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0500 // Change this to the appropriate value to target IE 5.0 or later.
#endif

 

이렇게 하니 문제 없이 빌드가 성공 되었습니다.

 

주위에서 VC++의 새로운 버전이 나와도 쉽게 사용하지 못하는 경우가 오래 전에 만들었던 프로젝트를 포팅 할 수 없어서 이전 버전을 어쩔 수 없이 사용한다는 이야기를 종종 듣습니다.

그러나 저는 운이 좋아서인지 2002버전부터 순차적으로 새 버전의 VC++을 사용할 수 있어서 VC++6에서 VS2002로 넘어갈 때만 빌드 문제를 겪었습니다.

그래서 이런 포팅에 대한 문제는 잘 알지 못합니다. 이번에는 예전에 만들었던 코드를 C++0x 코드로 바꾸고 싶어서 오래 전에 만들었던 프로젝트를 VC++ 10로 포팅하면서 정말 정말 오랜만에 이런 문제를 겪어 보게 되고 해결 방법을 포스팅 할 수 있었습니다.

 

혹시 앞으로 또 이런 경우가 발생하면 바로 바로 공유하도록 하겠습니다.  





Visual C++ 10의 변화

Visual C++ 10 2010. 5. 2. 22:08 Posted by 알 수 없는 사용자

영문판 VS 2010(Visual C++ 10)은 나왔고, 한글판은 61일에 나온다고 합니다.

 

Visual C++ 10을 도입하려고 하시는 분들은 전체적으로 어떤 변화가 있는지 알고 싶을 것이고, 특히 구매를 위해 회사 윗 분들에게 보고를 해야 되는 분들은 관련된 문서를 만들어야 하는 분들도 있으리라 생각합니다.

 

VC++ 10 도입이나 내부 스터디에 사용하도록 간단하게 VC++ 10의 달라진 점을 정리하여 문서를 만들어 보았습니다.

 

이 문서는 러프하게 만들어진 문서이니 참고로 사용하여 더 좋은 문서를 만드시기를 바랍니다. 특히 윗 분들에게 보고 하기 위해서 PT문서를 만들 때는 이 문서에 왜 필요한지에 대해서 좀 더 강력한 메시지를 넣기를 바랍니다.^^






디버깅 모드에서 역어셈블리 코드 보기

Visual C++ 10 2010. 2. 4. 09:00 Posted by 알 수 없는 사용자

VC++ 10 C++0x나 병렬 프로그래밍 라이브러리 이외에도 툴적인 측면에서도 여러 좋은 기능들이 추가 되었습니다. 알고 있으면 작업할 때 편리한데 시간이 부족하여 제가 아직 자세하게 찾아보지 못해서 소개하지 못한 것이 많이 아쉽습니다. 그래서 짥은 것이라도 틈틈이 시간나면 소개하려고 합니다.

 

 

VC++ 10에서는 디버깅 모드에서도 역어셈블리 코드를 볼 수 있습니다.

 

메뉴에서 “Debug” -> “Windows” -> “Disassembly”를 선택합니다.



아래와 같이 역어셈블리 코드 창이 나타납니다.



그러나 위 화면을 보면 코드 바이트는 표시되지 않고 있습니다.

코드 바이트를 보고 싶다면 위 화면 왼쪽 상단의 “Viewing Option”을 클릭합니다.



위와 같이 옵션을 선택할 수 있습니다. 이 중 “Show code bytes”를 선택합니다.

그러면 아래와 같이 코드 바이트가 표시됩니다.



 

 

 

참고

http://d.hatena.ne.jp/kkamegawa/20100130/p1

 

About Visual C++ 10

Visual C++ 10 2009. 10. 15. 08:30 Posted by 알 수 없는 사용자

지난 10 7일에서 9일까지 서울 코엑스에서 ‘KGC 2009’ 라는 게임 개발 컨퍼런스가 열렸습니다.

저는 여기서 ‘Visual C++ 10’에 대해서 강연을 했습니다.

 

이번 버전 10은 이전에 비해서 변화한 부분이 많아서 가장 큰 핵심인 ‘C++0x’‘Parallel’부분만 주제를 잡았는데도 시간 부족상 다 하지는 못했습니다.

 

아직 VSTS 2010 Beta1을 설치하지 않은 분들도 많으실 것 같아서 Demo까지 하려니 도저히 시간이 남지 않더군요.

 

이번에 제대로 하지 못한 ‘Parallel’ 부분은 꼭 다음에 기회가 되는대로 강연을 하도록 하겠습니다.^^





ps : 근래 바빠서 블로그에 포스팅을 하지 못했는데 곧 새로운 글을 올리겠습니다.