추천중입니다.
닫기 블로그로 보내기


설정된 블로그가 없습니다.

블로그 설정하기

슬라이드를 블로그에 보내는 중입니다.
KGC 2009 - About Visual C++ 10
2
4171560
jacking 2009.10.11 14:01:55
KGC 2009에서 10월 7일 오후 4시30분에 강연했던 세션의 강연문서 입니다.
마가린 바르기bookmarkr.netmetagsWzd.com네이버에 북마크하기다음에 북마크하기HanRSS에 북마크하기이올린에 북마크하기Pumfit에 글 올리기News2.0에 투고하기del.icio.us에 북마크하기
URL Copy_btn
EMBED Copy_btn
작성자가 등록한 다른 큐
댓글을 작성하기 위해서는 먼저 로그인 하셔야 합니다.
현재 댓글의 수는 0 개 입니다.
Page 0: Page 1: About Visual C++ 10 Microsoft Visual C++ MVP 마이에트 엔터테인먼트 Server Programmer 최흥배 Page 2: Page 3: Page 4: Page 5: 목차 • Visual C++ 6에서 Visual C++ 9….. • Visual C++ 10의 변화 • C++0x의 싞 기능 • Concurrency Runtime Page 6: Page 7: Page 8: • C++ 표준을 더욱 더 준수 • UI 완전 변경 • Managed C++ • Visual C++ 7 새로욲 Visual Studio 시작… Page 9: Page 10: • 마이너 업그레이드 버전 • C++ 표준을 더욱 더 준수 • VC++ 버전 7(2002와 동일) Page 11: • 코드 분석 기능 추가(SAL) • 64비트 컴파일 지원 • Managed C++ -> C++/CLI • VC++ 버전 8 Page 12: http://jacking.tistory.com/17 Page 13: • C++/CLI, SAL 보완 • MFC UI 라이브러리 추가 • 멀티 스레드 디버깅 강화 • C++0x TR1 라이브러리 추가 • VC++ 버전 9 2002부터 시작했던 Visual Studio 체계의 마지막 Page 14: Page 15: 뭐 바뀐게 있냐? -_- Page 16: Page 17: Page 18: • 목표는 256K Memory의 16Bit DOS • Intellisense를 크게 어휘분석과 의미 해석으로 나눔 • 빠른 개발을 위해 ifdef를 획기적으로 이용 • Intellisense 컴파읷러를 FEACP 라고 부름 Front End Auto Complete Parser의 약어 • 당시의 CPU 속도는 100MHz 정도. 드롭 다운 윈도우를 100ms 이내에. 초기화、멤버 오프셋 계산、vtable 생성 생략. Page 19: • 테스트와 점검은 악몽 Ifdef 때문에 많은 코드나 데이터의 의존성 문제 • Ifdef 지옥에 떨어졌음을 깨닫음 • 사람들은 Java나 C#의 Intellisense 기능을 원함. • FEACP애서는 실현 불가능함 Page 20: 파이날 판타지 5 (슈퍼 패미콤) 파이날 판타지 13 (PS3) 펜티엄 프로세스 66Mhz(1993년) 읶텔 i7 프로세스 4 core 3.33Ghz PC의 메모리는 4메가(1995) PC의 메모리는 4기가 “요즘 PC의 속도와 용량이면 하나의 컴파일러로 C++의 코드 생성과 intellisense 양쪽 모두 가능한 새로욲 intellisense을 맊들 수 있다.!!!” Page 21: Page 22: • Intellisense에 가장 중요한 기능은 “정확성” Intellisense == 커맨드 라인 컴파일러 • 드롭 다운으로 올바를 멤버를 얻을 수 있는 것 이상 • 읷부러 빌드를 하지 않아도 경고를 사젂에 알 수 있다. Intellisense의 Parse 중에 발견된 에러는 진짜 에러 !!! • 정확성에 의해 원시 코드의 리팩토링 등 가능 • 장래에는 유저가 접근할 수 있는 API 제공 • C++ 원키 코드에 대한 고정밀도의 정보에 접근할 수 있도록 할 예정 Page 23: Page 24: 젤다의 전설 – 링크의 모험(패미콤) 젤다의 전설 – 싞들의 트라이포스 (슈퍼패미콤) 젤다의 전설 – 시간의 오카리나 (닌텐도64) Page 25: • IDE를 WPF 및 닷넷 기술로 구현 • 응답성, 확장성, 정확성 강화 - 기존의 ncb 파일 제거, SQL Compact로 대체 - 대 규모 프로젝트도 문제 없음 • MSBuild 개선 • Deploy 설정 가능 Page 26: Visual C++ 10 IDE Page 27: 멀티 모니터 지원 Page 28: 디버깅 • 디버깅 하고 싶은 변수를 클릭하여 읷종의 메모를 만듬. 코멘트 추가 가능 •I DE 내,외에 위치 가능 • 디버깅이 끝나면 보이지 않음. • 영구 저장된다. Page 29: 소스 코드 창 확대/축소 Page 30: 추가된 MFC 라이브러리 CTaskDialog Restart Manager Page 31: - auto static_assert Rvalue Reference lambda Page 32: C++0x 새로욲 기능에 의해 • C++ 사용이 편해졌고, • 언어의 표현력이 증대 되고, • 성능 향상이 이루어졌습니다. Page 33: auto 1. 변수 정의 때 명시적으로 type을 지정하지 않아도 된다. 2. auto로 정의한 변수는 초기화할 때 type이 결정. 3. 컴파일 타임 때 type이 결정. 4. 템플릿 프로그래밍에 사용하면 코딩이 간편. 5. 코드 가독성이 향상 Page 34: 예제 코드 auto NPCName = "KKamahui"; cout << "NPC Name : " << NPCName << endl; auto* CharInven = new CharacterInvenInfo(); typedef std::list<MCommand*> LIST_COMMAND; LIST_COMMAND::iterator iter = m_listCommand.begin(); auto iter = m_listCommand.begin(); Page 35: auto Page 36: static_assert Assert는 논리적읶 오류 찾기, 작업 결과 확읶, 처리해야 할 오류 조건 테스트 할때 사용 static_assert는 컴파읷 시점에서 실체화할 템플릿의 젂제 조건을 조사할 때 사용 static_assert( “constant-expression”, “error-message” ); “constant-expression” - 검사할 조건 식 “error-message” - 조건이 false읷 경우 출력할 error 메시지 Page 37: 예제 코드 #include <iostream> using namespace std; const int MAX_LEVEL = 120; int main() { static_assert( MAX_LEVEL <= 100, "Warring - MAX_LEVEL" ); return 0; } Page 38: 예제 코드 template< typename T1, int StackSize > class MYSTACK { static_assert( StackSize >= 10, "Stack Size Error" ); public : MYSTACK() : data( new T[StackSize] ) { } ………. }; Page 39: static_assert Page 40: Rvalue Reference C++ 장점 중 하나인 성능은 향상 되었지맊 ^^ C++ 단점 중 하나인 복잡함도 증가 -_-; Page 41: „&‟을 사용한 참조는 Lvalue Reference int a = 10; int& refA = a; „&&‟을 사용한 참조는 Rvalue Reference int&& RrefA = a; Page 42: RValue Reference의 의해 프로그램의 성능이 좋아지고 낭비가 없어짐. Page 43: C+ + C", Java… C Page 44: 왜 성능이 좋아질까요? Move semantics Page 45: • move 생성자와 move 대입 연산자 • move 생성자와 move 대입 연산자는 암묵적으로 맊들어지지 않는다. • 복사 생성자는 move 생성자보다 우선 한다. • 대입 연산자는 move 연산자보다 우선 한다. • 복사가 아닌 메모리 상에서 이동 • C++0x의 STL에는 Move semantics가 적용 Page 46: move 생성자와 move 연산자 // Move 생성자 QuestInfo(QuestInfo&& quest) : Name(quest.Name), NameLen(quest.NameLen) { quest.Name = NULL; quest.NameLen = 0; } // Move 연산자 QuestInfo& operator=(QuestInfo&& quest) { if( this != &quest ) { delete Name; Name = quest.Name; NameLen = quest.NameLen; quest.Name = NULL; quest.NameLen = 0; } } return *this; Page 47: 복사 생성자와 Move 생성자의 차이 // 복사 생성자 QuestInfo(const QuestInfo& quest) : Name(new char[quest.NameLen]), NameLen(quest.NameLen) { memcpy(Name, quest.Name, quest.NameLen); } // Move 생성자 QuestInfo(QuestInfo&& quest) : Name(quest.Name), NameLen(quest.NameLen) { quest.Name = NULL; quest.NameLen = 0; } Page 48: VC++ 10 Beta 1의 STL의 vector Page 49: std::move NPC npc2; NPC npc3; npc3 = npc2; NPC npc7; NPC npc8; npc8 = std::move(npc7); Page 50: Move semsntice에 따른 주의 점 int main() { vector<int> v1; v1.push_back(10); v1.push_back(12); vector<int> v2 = std::move(v1); cout << v1.size() << endl; cout << v2.size() << endl; return 0; } Page 51: Perfect forwarding void inner(int& i) { } template <typename T> void outer(T& t) { inner(t); } int main() { int a = 5; outer(a); outer(6); return 0; } 컴파읷 하면 outer(6)에서 컴파읷 에러가 발생 “error C2664: 'outer' : cannot convert parameter 1 from 'int' to 'int &'“ 파라메터에 const를 포함하는 함수를 재정의 Page 52: 예제 코드 void inner(int& i) { } template <typename T> void outer(T&& t) { inner(t); } int main() { int a = 5; outer(a); outer(6); return 0; } Page 53: Rvalue Reference Page 54: lambda 간단하게 말하면 익명함수. 람다 식(람다 함수) C#에서는 람다 식 덕분에 Linq의 사용이 간편 C++에서는 STL을 사용할 때와 템플릿 을 사용할 때 편리함 Page 55: 예제 코드 struct FindDieUser { bool operator() (User& tUser) const { return tUser.IsDie(); } }; vector< User >::iterator Iter; Iter = find_if( Users.begin(), Users.end(), FindDieUser() ); Page 56: 예제 코드 vector< User >::iterator Iter; Iter = find_if( Users.begin(), Users.end(), [](User& tUser) -> bool { return true == tUser.IsDie(); } ); Page 57: 람다 사용 방법 [](파라메터) { 식 } int 값에 50을 더한 후 반홖하는 람다 함수 [](int x) { return x + 50; } Page 58: 파라미터와 반홖 값이 같을 때 [](파라미터) { 식 } [](int x) { return x + 50; } 파라미터와 반홖 값이 다를 때 [](파라미터) -> 반홖 값 자료형 { 식 } [](int x) -> bool { return true; } 반홖 값이 없을 때 [](파라미터) { 식 } [](int x) { ++x; } Page 59: 클로져 사용 int TotalMoney1 = 0; for_each( Moneys.begin(), Moneys.end(), [&TotalMoney1](int Money) { TotalMoney1 += Money; } ); Page 60: 클래스의 멤버 함수 호출 클래스 멤버 내의 람다 식은 해당 클래스에서는 friend로 읶식 람다 식에서 private 멤버의 접근도 가능 Page 61: 예제 코드 void AllSend() const { for_each( SendPackets.begin(), SendPackets.end(), [this](int i){ Send(i); } ); } Page 62: lambda Page 63: Language Feature Rvalue references Rvalue references for *this Initialization of class objects by rvalues Variadic templates Extending variadic template template parameters Initializer lists Static assertions auto-typed variables Multi-declarator auto Removal of auto as a storage-class specifier New function declarator syntax Lambda expressions and closures Constness of lambda functions Declared type of an expression Right angle brackets Default template arguments for function templates Solving the SFINAE problem for expressions Template aliases Extern templates Null pointer constant Strongly-typed enums Forward declarations for enums Generalized attributes Generalized constant expressions Alignment support Delegating constructors Inheriting constructors Explicit conversion operators New character types Unicode string literals Raw string literals Universal character name literals Extensible literals Standard Layout Types Defaulted and deleted functions Proposal Available in GCC 4.4? N2118 Yes N2439 No N1610 Yes N2242 Yes N2555 Yes N2672 Yes N1720 Yes N1984 Yes N1737 Yes N2546 Yes N2541 Yes N2550 No N2658 No N2343 Yes N1757 Yes DR226 Yes DR339 Yes N2258 No N1987 Yes N2431 No N2347 Yes N2764 No N2761 No N2235 No N2341 No N1986 No N2540 No N2437 No N2249 Yes N2442 Yes N2442 No N2170 No N2765 No N2342 No N2346 Yes Extended friend declarations Extending sizeof Inline namespaces Unrestricted unions Local and unnamed types as t emplate arguments Minimal support for garbage c ollection and reachability-base d leak detection Concepts N1791 N2253 N2535 N2544 N2657 No Yes Yes No No N2670 N2773 No No No No No No No No Yes Concurrency Sequence points N2239 Atomic operations N2427 Strong Compare and Exchange N2748 Bidirectional Fences N2752 Memory model N2429 Data-dependency ordering: at N2664 omics and memory model Propagating exceptions N2179 Abandoning a process and at_ N2440 quick_exit Allow atomics use in signal ha N2547 ndlers Thread-local storage N2659 Dynamic initialization and dest N2660 ruction with concurrency C99 Features in C++0x __func__ predefined identifier N2340 C99 preprocessor N1653 long long N1811 Extended integral types N1988 No No No No Yes Yes Yes No Page 64: Page 65: CPU의 성능 향상은 Ghz에서 CPU Pentium 4 Core2 Duo Core i7 코어 하이퍼 스레드 스레드 GHz 1 2 3.4 〇 2 X 2 3.0 4 8 3.2 〇 Page 66: Page 67: 무어의 법칙은 불변이지만… Page 68: 소프트웨어 Free Lunch는 끝났다 Page 69: Page 70: 멀티 스레드? 멀티코어? 그 거 먹는걲가요? 우걱우걱 Page 71: 이상 현실 Page 72: • Parallel Patterns Library • Asynchronous Agents Library • Synchronization Data Structures Page 73: 병렬 패턴 라이브러리 ( PPL ) Page 74: PPL의 세 가지 features • Task Parallelism • Parallel algorithms • Parallel containers and objects Page 75: Task Parallelism • 실제적읶 task의 실행은 task_group에서 한다. • unstructured_task_group(task_group) 와 structured_task_group 로 나누어짂다. • task_group : 스레드 세이프 structured_task_group : 스레드 세이프 하지 않음. Page 76: Main Thread task_group1.run( task1) Thread A task_group1.run( task2) Thread B task_group1.run( task3) Main Thread structured_task_group1.run( task1) Thread A structured_task_group1.run( task2) Page 77: 초 간단!!! task 사용 방법 1. ppl.h 파일을 포함합니다. #include <ppl.h> Concurrency Runtime의 네임 스페이를 선언합니다. using namespace Concurrency; 태스크 그룹을 정의합니다. structured_task_group structured_tasks; 태스크를 정의합니다. auto structured_task1 = make_task([&] { Plus(arraynum1, true); } ); 태스크를 태스크 그룹에 추가한 후 실행합니다. structured_tasks.run( structured_task1 ); 태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다. structured_tasks.wait(); 2. 3. 4. 5. 6. Page 78: parallel_task Page 79: Parallel Algorithms • 데이터 컬렉션을 대상으로 쉽게 병렬 작업을 할 수 있게 해주는 알고리즘들. • C++ STL에서 제공하는 알고리즘과 비슷한 모양과 사용법. • paeallel_for, parallel_for_each, parallel_invoke가 구현되어 있음. parallel_accumulate, parallel_partial_sum은 Beta 1에서는 아직 미 구현. Page 80: parallel_for • for 문을 병렬화. • for 문과 사용 방법이 흡사하여 쉽게 변홖. • step 값을 지정하는 버젂과 지정하지 않는 버젂 두 개가 있음(지정하지 않으면 1). • index 조사는 „<„만 지원. Page 81: 초 간단!!! parallel_for 사용 법 1. ppl.h 파일을 포함합니다. #include <ppl.h> 2. Concurrency Runtime의 네임 스페이를 선언합니다. using namespace Concurrency; 3. parallel_for에서 호출할 함수 정의 4. parallel_for에서 사용할 data set 정의. 5. parallel_for 사용. Page 82: parallel_for_each • STL의 for_each 알고리즘을 병렬화. • for_each 와 사용 방법이 같음. Page 83: 초 간단!!! parallel_for_each 사용 법 1. ppl.h 파일을 포함합니다. #include <ppl.h> 2. Concurrency Runtime의 네임 스페이를 선언합니다. using namespace Concurrency; 3. parallel_for_each에서 호출할 함수 정의 4. parallel_for_each에서 사용할 data set 정의. 5. parallel_for_each 사용. Page 84: Page 85: parallel_invoke • 병렬로 읷련의 태스크 실행. • 동시 실행할 복수의 독립된 태스크를 실행할 때 좋음. • task_group과 비슷하나 사용방법은 더 쉬움 그러나 최대 10개의 태스크만 병렬 작업이 가 능하다. Page 86: 초 간단!!! parallel_invoke 사용 법 1. ppl.h 파일을 포함합니다. #include <ppl.h> 2. Concurrency Runtime의 네임 스페이를 선언합니다. using namespace Concurrency; 3. 태스크 정의 4. parallel_invoke 사용. Page 87: parallel objects - combinable • 스레드 세이프한 오브젝트. • 계산 실행한 후 최종 결과에 그 계산 결과를 통합하는 재 사용 가능 한 로컬 스트리지 제공. • 복수의 스레드 또는 채스크 간에 공유 리소스가 있는 경우 편리. • lock-free thread-local sub-computations during parallel algorithms • combinable 클래스에 사용할 데이터는 기본 생성자와 복사 생성자 를 가지고 있어야 한다. • Win32 API의 thread local storage와 비슷. • combine, combinable_each 제공 Page 88: 예제 코드 #include <algorithm> #include <iostream> int result = sums.combine([](int left, int right) { return left + right; }); cout << "The sum of " << values.front() << " to " << values.back() << " is " << result << "."; } using namespace std; using namespace Concurrency; int main() { vector<int> values(10); int n = 0; generate(values.begin(), values.end(), [&] { return ++n; } ); combinable<int> sums; parallel_for_each(values.begin(), values.end(), [&](int n) { sums.local() += n; }); Page 89: 예제 코드 using namespace std; using namespace Concurrency; int main() { vector<int> values(10); int n = 0; generate(values.begin(), values.end(), [&] { return ++n; } ); combinable<list<int>> odds; parallel_for_each(values.begin(), values.end(), [&](int n) { if (n % 2 == 1) odds.local().push_back(n); }); list<int> result; odds.combine_each([&](list<int>& local) { local.sort(less<int>()); result.merge(local, less<int>()); }); cout << "The odd elements of the vector are:"; for_each(result.begin(), result.end(), [](int n) { cout << ' ' << n; }); } Page 90: concurrent containers • 병렬 홖경에서 스레드 세이프하게 데이터 를 저장. • concurrent_queue, concurrent_vector, concurrent_hash_map. • Beta1에서는 아직 미 구현. Page 91: MSDN http://msdn.microsoft.com/enus/library/dd504870(VS.100).aspx Visual C++ Team 블로그 http://blogs.msdn.com/vcblog/default.aspx VSTS 2010 스터디 블로그 http://vsts2010.net Parallel Programming in Native Code http://blogs.msdn.com/nativeconcurrency/default.aspx 본인 블로그 http://jacking.tistory.com/ Page 92: Page 93: