About Visual C++ 10

2,113 views
1,982 views

Published on

KGC2009 강연

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,113
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
19
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

About Visual C++ 10

  1. 1. About Visual C++ 10<br />Microsoft Visual C++ MVP<br />마이에트 엔터테인먼트<br />Server Programmer 최흥배<br />
  2. 2. 2003년 1월 ~<br />
  3. 3.
  4. 4.
  5. 5. 목차<br />Visual C++ 6에서 Visual C++ 9…..<br />Visual C++ 10의변화<br />C++0x의 신 기능<br />Concurrency Runtime<br />
  6. 6. 1. Visual C++ 6 ~ 9<br />
  7. 7.
  8. 8. <ul><li> C++ 표준을 더욱 더 준수
  9. 9. UI 완전 변경
  10. 10. Managed C++
  11. 11. Visual C++ 7</li></ul>새로운 Visual Studio 시작… <br />
  12. 12.
  13. 13. <ul><li>마이너 업그레이드 버전
  14. 14. C++ 표준을 더욱 더 준수
  15. 15. VC++ 버전 7(2002와 동일)</li></li></ul><li><ul><li>코드 분석 기능 추가(SAL)
  16. 16. 64비트 컴파일 지원
  17. 17. Managed C++ -> C++/CLI
  18. 18. VC++ 버전 8</li></li></ul><li>http://jacking.tistory.com/17<br />
  19. 19. <ul><li> C++/CLI, SAL 보완
  20. 20. MFC UI 라이브러리 추가
  21. 21. 멀티 스레드 디버깅 강화
  22. 22. C++0x TR1 라이브러리 추가
  23. 23. VC++ 버전 9</li></ul>2002부터 시작했던 Visual Studio 체계의 마지막<br />
  24. 24. Visual Studio 2010( Visual C++ 10) 새로운 Visual Stuido시대의 시작<br />
  25. 25. 뭐 바뀐게 있냐? -_-<br />
  26. 26. 2. Visual C++ 10의 변화<br />
  27. 27. Visual C++ Intellisense<br />
  28. 28. <ul><li> 목표는 256K Memory의 16Bit DOS
  29. 29. Intellisense를 크게 어휘분석과 의미 해석으로 나눔
  30. 30. 빠른 개발을 위해 ifdef를 획기적으로 이용
  31. 31. Intellisense컴파일러를 FEACP 라고 부름 Front End Auto Complete Parser의 약어
  32. 32. 당시의 CPU 속도는 100MHz 정도.드롭 다운 윈도우를 100ms 이내에. 초기화、멤버 오프셋 계산、vtable생성 생략.</li></li></ul><li><ul><li>테스트와 점검은 악몽Ifdef때문에 많은 코드나 데이터의 의존성 문제
  33. 33. Ifdef지옥에 떨어졌음을 깨닫음
  34. 34. 사람들은 Java나 C#의 Intellisense기능을 원함.
  35. 35. FEACP애서는 실현 불가능함</li></li></ul><li>1992년<br />2009년<br />파이날 판타지 5 (슈퍼 패미콤)<br />파이날 판타지 13 (PS3)<br />펜티엄 프로세스 66Mhz(1993년)<br />인텔 i7 프로세스 4 core 3.33Ghz<br />PC의 메모리는 4메가(1995)<br />PC의 메모리는 4기가<br />“요즘 PC의 속도와 용량이면 하나의 컴파일러로 C++의 코드 생성과 intellisense 양쪽 모두 가능한 새로운 intellisense을 만들 수 있다.!!!”<br />
  36. 36. Dev 10 – Visual C++ 10<br />
  37. 37. <ul><li>Intellisense에 가장 중요한 기능은 “정확성”Intellisense == 커맨드 라인 컴파일러
  38. 38. 드롭 다운으로 올바를 멤버를 얻을 수 있는 것 이상
  39. 39. 일부러 빌드를 하지 않아도 경고를 사전에 알 수 있다.Intellisense의 Parse 중에 발견된 에러는 진짜 에러 !!!
  40. 40. 정확성에 의해 원시 코드의 리팩토링 등 가능
  41. 41. 장래에는 유저가 접근할 수 있는 API 제공
  42. 42. C++ 원키 코드에 대한 고정밀도의 정보에 접근할 수 있도록 할 예정</li></li></ul><li>Visual C++ 10 IDE<br />
  43. 43. VC++ 6<br />VC++ 9<br />젤다의 전설 – 링크의 모험(패미콤)<br />젤다의 전설 – 신들의 트라이포스(슈퍼패미콤)<br />VC++ 10<br />젤다의 전설 – 시간의 오카리나(닌텐도64)<br />
  44. 44. <ul><li> IDE를 WPF 및 닷넷 기술로 구현
  45. 45. 응답성, 확장성, 정확성 강화</li></ul> - 기존의 ncb파일 제거, SQL Compact로 대체<br /> - 대 규모 프로젝트도 문제 없음<br /><ul><li>MSBuild개선
  46. 46. Deploy 설정 가능</li></li></ul><li>DEMO<br />Visual C++ 10 IDE<br />
  47. 47. 멀티 모니터 지원 <br />
  48. 48. 디버깅<br /><ul><li> 디버깅 하고 싶은 변수를 클릭하여 일종의 메모를 만듬. 코멘트 추가 가능
  49. 49. I DE 내,외에 위치 가능
  50. 50. 디버깅이 끝나면 보이지 않음.
  51. 51. 영구 저장된다.</li></li></ul><li>소스 코드 창 확대/축소<br />
  52. 52. 추가된 MFC 라이브러리<br />Restart Manager<br />CTaskDialog<br />
  53. 53. 3. C++ 0x의 신 기능<br /><ul><li> auto
  54. 54. static_assert
  55. 55. Rvalue Reference
  56. 56. lambda</li></li></ul><li>C++0x 새로운 기능에 의해 <br /><ul><li> C++ 사용이 편해졌고,
  57. 57. 언어의 표현력이 증대 되고,
  58. 58. 성능 향상이 이루어졌습니다.</li></li></ul><li>auto<br />1. 변수 정의 때 명시적으로 type을 지정하지 않아도 된다.<br />2. auto로 정의한 변수는 초기화할 때 type이 결정.<br />3. 컴파일 타임 때 type이 결정.<br />4. 템플릿 프로그래밍에 사용하면 코딩이 간편. <br />5. 코드 가독성이 향상<br />
  59. 59. 예제 코드<br />auto NPCName = "KKamahui";cout << "NPC Name : " << NPCName << endl;<br />auto* CharInven = new CharacterInvenInfo();<br />typedef std::list<MCommand*> LIST_COMMAND;LIST_COMMAND::iteratoriter = m_listCommand.begin();<br />auto iter = m_listCommand.begin();<br />
  60. 60. DEMO<br />auto<br />
  61. 61. static_assert<br />Assert는 논리적인 오류 찾기, 작업 결과 확인, <br />처리해야 할 오류 조건 테스트 할때 사용<br />static_assert는 컴파일 시점에서 실체화할 템플릿의 전제 조건을 조사할 때 사용<br />static_assert( “constant-expression”, “error-message” );<br />“constant-expression” - 검사할 조건 식<br />“error-message”       -조건이 false일 경우 <br />출력할 error 메시지<br />
  62. 62. 예제 코드<br />#include <iostream><br />using namespace std;<br /> <br />const int MAX_LEVEL = 120;<br /> <br />int main()<br />{<br />     static_assert( MAX_LEVEL <= 100, "Warring - MAX_LEVEL" );<br />     return 0;<br />}<br />
  63. 63. 예제 코드<br />template< typename T1, intStackSize ><br />class MYSTACK<br />{<br />     static_assert( StackSize >= 10, "Stack Size Error" );<br />public :<br />     MYSTACK() : data( new T[StackSize] )<br />     {<br />     }<br />……….<br />};<br />
  64. 64. DEMO<br />static_assert<br />
  65. 65. Rvalue Reference<br />C++ 장점 중 하나인<br />성능은 향상 되었지만 ^^<br />C++ 단점 중 하나인<br />복잡함도 증가 -_-;<br />
  66. 66. ‘&’을 사용한 참조는 Lvalue Reference<br />int a = 10;<br />int& refA = a;<br />‘&&’을 사용한 참조는 Rvalue Reference<br />int&& RrefA = a;<br />
  67. 67. RValue Reference의 의해 <br />프로그램의 성능이 좋아지고<br />낭비가 없어짐.<br />
  68. 68. C++<br />C#, Java…<br />C<br />
  69. 69. 왜 성능이 좋아질까요?<br />Move semantics<br />
  70. 70. NEW<br />NEW<br /><ul><li>move 생성자와move 대입 연산자
  71. 71. move 생성자와move 대입 연산자는 암묵적으로 만들어지지 않는다.
  72. 72. 복사 생성자는move 생성자보다 우선 한다.
  73. 73. 대입 연산자는 move 연산자보다 우선 한다.
  74. 74. 복사가 아닌 메모리 상에서 이동
  75. 75. C++0x의 STL에는 Move semantics가 적용 </li></li></ul><li>move 생성자와move 연산자<br />// Move 생성자<br />    QuestInfo(QuestInfo&& quest)<br />        : Name(quest.Name), NameLen(quest.NameLen)<br />    {<br />        quest.Name = NULL;<br />        quest.NameLen = 0;<br />    }<br /> <br /> // Move 연산자<br />    QuestInfo& operator=(QuestInfo&& quest)<br />    {<br />        if( this != &quest )<br />           {<br />                     delete Name;<br />        <br />                     Name = quest.Name;<br />        NameLen = quest.NameLen;<br /> <br />                     quest.Name = NULL;<br />        quest.NameLen = 0;<br />           }<br />        return *this;<br />    }<br />
  76. 76. 복사 생성자와Move 생성자의 차이<br />// 복사 생성자<br />QuestInfo(const QuestInfo& quest)<br />        : Name(new char[quest.NameLen]), NameLen(quest.NameLen)<br />{<br />      memcpy(Name, quest.Name, quest.NameLen);<br />}<br /> <br />// Move 생성자<br />QuestInfo(QuestInfo&& quest)<br />        : Name(quest.Name), NameLen(quest.NameLen)<br />{<br />      quest.Name = NULL;<br />      quest.NameLen = 0;<br />}<br />
  77. 77. VC++ 10 Beta 1의 STL의 vector<br />
  78. 78. std::move<br />NPC npc2; <br />NPC npc3;<br />npc3 = npc2;<br />NPC npc7;         <br />NPC npc8;<br />npc8 = std::move(npc7);<br />
  79. 79. Move semsntice에 따른 주의 점<br />int main()<br />{<br /> vector<int> v1;<br /> v1.push_back(10);<br /> v1.push_back(12);<br /> vector<int> v2 = std::move(v1);<br />cout << v1.size() << endl;<br />cout << v2.size() << endl;<br /> return 0;<br />}<br />
  80. 80. Perfect forwarding<br />void inner(int& i)<br />{<br />}<br />template <typename T> void outer(T& t) {<br /> inner(t);<br />}<br />int main()<br />{<br />int a = 5;<br /> outer(a);<br /> outer(6);<br /> return 0;<br />}<br />컴파일 하면 outer(6)에서 컴파일 에러가 발생<br />“error C2664: 'outer' : cannot convert parameter 1 from 'int' to 'int &'“<br />파라메터에const를 포함하는 함수를 재정의<br />
  81. 81. 예제 코드<br />void inner(int& i)<br />{<br />}<br />template <typename T> void outer(T&& t){<br /> inner(t);<br />}<br />int main()<br />{<br />int a = 5;<br /> outer(a);<br /> outer(6);<br /> return 0;<br />}<br />
  82. 82. DEMO<br />Rvalue Reference<br />
  83. 83. lambda<br />간단하게 말하면 익명함수. 람다 식(람다 함수)<br />C#에서는 람다 식 덕분에 Linq의 사용이 간편<br />C++에서는 STL을 사용할 때와 템플릿을 사용할 때 편리함<br />
  84. 84. 예제 코드<br />structFindDieUser<br />{<br />bool operator() (User& tUser) const <br /> { <br /> return tUser.IsDie(); <br /> }<br />};<br />vector< User >::iteratorIter;<br />Iter = find_if( Users.begin(), Users.end(), FindDieUser() );<br />
  85. 85. 예제 코드<br />vector< User >::iteratorIter;<br />Iter = find_if( Users.begin(), Users.end(), <br /> [](User& tUser) -> bool { <br /> return true == tUser.IsDie(); } <br />);<br />
  86. 86. 람다 사용 방법<br />[](파라메터) { 식 }<br />int값에 50을 더한 후 반환하는 람다 함수 <br />[](int x) { return x + 50; }<br />
  87. 87. 파라미터와 반환 값이 같을 때<br />[](파라미터) { 식 }<br />[](int x) { return x + 50; }<br />파라미터와 반환 값이 다를 때<br />[](파라미터) -> 반환 값 자료형{ 식 }<br />[](int x) -> bool { return true; }<br />반환 값이 없을 때<br />[](파라미터) { 식 }<br />[](int x) { ++x; }<br />
  88. 88. 클로져 사용<br />int TotalMoney1 = 0;<br />for_each( Moneys.begin(), Moneys.end(), <br /> [&TotalMoney1](int Money) <br /> {<br /> TotalMoney1 += Money;<br /> }<br />);<br />
  89. 89. 클래스의 멤버 함수 호출<br />클래스 멤버 내의 람다 식은 해당 클래스에서는 friend로 인식<br />람다 식에서 private 멤버의 접근도 가능<br />
  90. 90. 예제 코드<br />void AllSend() const<br />{<br />for_each( SendPackets.begin(),<br />SendPackets.end(), <br />[this](inti){ Send(i); }<br /> );<br /> }<br />
  91. 91. DEMO<br />lambda<br />
  92. 92.
  93. 93. 4. Concurrency Runtime<br />
  94. 94. CPU의 성능 향상은<br />Multi Core로<br />Ghz에서<br />
  95. 95.
  96. 96. 무어의 법칙은 불변이지만…<br />
  97. 97. 소프트웨어 Free Lunch는 끝났다<br />
  98. 98.
  99. 99. 멀티 스레드? 멀티코어? 그거 먹는건가요? 우걱우걱<br />
  100. 100. 현실<br />이상<br />
  101. 101. Concurrency Runtime<br />병행 런타임<br /><ul><li> Parallel Patterns Library
  102. 102. Asynchronous Agents Library
  103. 103. Synchronization Data Structures</li></li></ul><li>병렬 패턴 라이브러리 ( PPL )<br />
  104. 104. PPL의 세 가지 features<br /><ul><li> Task Parallelism
  105. 105. Parallel algorithms
  106. 106. Parallel containers and objects </li></li></ul><li>Task Parallelism<br />실제적인 task의 실행은 task_group에서 한다.<br />unstructured_task_group(task_group) 와 structured_task_group로나누어진다.<br />task_group : 스레드 세이프structured_task_group : 스레드 세이프 하지 않음.<br />
  107. 107. Main Thread<br />Main Thread<br />task_group1.run( task1)<br />structured_task_group1.run( task1)<br />Thread A<br />task_group1.run( task2)<br />Thread B<br />task_group1.run( task3)<br />Thread A<br />structured_task_group1.run( task2)<br />
  108. 108. 초 간단!!! task 사용 방법<br />ppl.h파일을 포함합니다.#include <ppl.h><br />Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;<br />태스크 그룹을 정의합니다.structured_task_groupstructured_tasks;<br />태스크를 정의합니다.auto structured_task1 = make_task([&] { Plus(arraynum1, true); } );<br />태스크를 태스크 그룹에 추가한 후 실행합니다.  structured_tasks.run( structured_task1 );<br />태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다.structured_tasks.wait();<br />
  109. 109. DEMO<br />parallel_task<br />
  110. 110. Parallel Algorithms<br />데이터컬렉션을 대상으로 쉽게 병렬 작업을 할 수 있게 해주는 알고리즘들.<br />C++ STL에서 제공하는 알고리즘과 비슷한 모양과 사용법.<br />paeallel_for, parallel_for_each, parallel_invoke가 구현되어 있음.parallel_accumulate, parallel_partial_sum은 Beta 1에서는 아직 미 구현.<br />
  111. 111. parallel_for<br />for 문을 병렬화.<br />for 문과 사용 방법이 흡사하여 쉽게 변환.<br />step 값을 지정하는 버전과 지정하지 않는 버전 두 개가 있음(지정하지 않으면 1).<br />index 조사는 ‘<‘만 지원. <br />
  112. 112. 초 간단!!! parallel_for사용 법<br />ppl.h파일을 포함합니다.#include <ppl.h><br />Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;<br />parallel_for에서 호출할 함수 정의<br />parallel_for에서 사용할 data set 정의.<br />parallel_for사용.<br />
  113. 113. parallel_for_each<br />STL의 for_each알고리즘을 병렬화.<br />for_each와 사용 방법이 같음.<br />
  114. 114. 초 간단!!! parallel_for_each사용 법<br />ppl.h파일을 포함합니다.#include <ppl.h><br />Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;<br />parallel_for_each에서 호출할 함수 정의<br />parallel_for_each에서 사용할 data set 정의.<br />parallel_for_each사용.<br />
  115. 115.
  116. 116. parallel_invoke<br />병렬로 일련의 태스크 실행.<br />동시 실행할 복수의 독립된 태스크를 실행할 때 좋음.<br />task_group과 비슷하나 사용방법은 더 쉬움그러나 최대 10개의 태스크만 병렬 작업이 가능하다.<br />
  117. 117. 초 간단!!! parallel_invoke사용 법<br />ppl.h파일을 포함합니다.#include <ppl.h><br />Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;<br />태스크 정의<br />parallel_invoke사용.<br />
  118. 118. parallel objects - combinable<br />스레드세이프한 오브젝트.<br />계산 실행한 후 최종 결과에 그 계산 결과를 통합하는 재 사용 가능한 로컬 스트리지 제공.<br />복수의 스레드 또는 채스크 간에 공유 리소스가 있는 경우 편리.<br />lock-free thread-local sub-computations during parallel algorithms<br />combinable 클래스에 사용할 데이터는 기본 생성자와 복사 생성자를 가지고 있어야 한다.<br />Win32 API의 thread local storage와 비슷.<br />combine, combinable_each제공<br />
  119. 119. 예제 코드<br />#include <algorithm><br />#include <iostream><br /> <br />using namespace std;<br />using namespace Concurrency;<br /> <br />int main()<br />{<br /> vector<int> values(10);<br />int n = 0;<br /> generate(values.begin(), values.end(), [&] { return ++n; } );<br /> <br /> combinable<int> sums;<br />parallel_for_each(values.begin(), values.end(), [&](int n) {<br />sums.local() += n; <br /> });<br /> <br />int result = sums.combine([](int left, int right) { <br /> return left + right; <br /> });<br /> <br />cout << "The sum of " << values.front() << " to " << values.back() <br /> << " is " << result << ".";<br />}<br />
  120. 120. 예제 코드<br />using namespace std;<br />using namespace Concurrency;<br /> <br />int main()<br />{<br /> vector<int> values(10);<br />int n = 0;<br /> generate(values.begin(), values.end(), [&] { return ++n; } );<br /> <br /> combinable<list<int>> odds;<br />parallel_for_each(values.begin(), values.end(), [&](int n) {<br /> if (n % 2 == 1)<br />odds.local().push_back(n); <br /> });<br /> <br /> list<int> result;<br />odds.combine_each([&](list<int>& local) { <br />local.sort(less<int>());<br />result.merge(local, less<int>());<br /> });<br /> <br />cout << "The odd elements of the vector are:";<br />for_each(result.begin(), result.end(), [](int n) {<br />cout << ' ' << n;<br /> });<br />}<br />
  121. 121. concurrent containers<br />병렬 환경에서 스레드 세이프하게 데이터를 저장.<br />concurrent_queue, concurrent_vector, concurrent_hash_map.<br />Beta1에서는 아직 미 구현.<br />
  122. 122. MSDN<br />http://msdn.microsoft.com/en-us/library/dd504870(VS.100).aspx<br />Visual C++ Team 블로그<br />http://blogs.msdn.com/vcblog/default.aspx<br />VSTS 2010 스터디블로그<br />http://vsts2010.net<br />Parallel Programming in Native Code<br />http://blogs.msdn.com/nativeconcurrency/default.aspx<br />본인 블로그<br />http://jacking.tistory.com/<br />

×