Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
About  Visual C++ 10Microsoft Visual C++ MVP마이에트 엔터테인먼트Server Programmer 최흥배
2003년 1월 ~
About  Visual C++ 10
About  Visual C++ 10
목차Visual C++ 6에서  Visual C++ 9…..Visual C++ 10의변화C++0x의 신 기능Concurrency Runtime
1. Visual C++ 6 ~ 9
About  Visual C++ 10
 C++ 표준을 더욱 더 준수
 UI 완전 변경
 Managed C++
 Visual C++ 7새로운 Visual Studio 시작…
About  Visual C++ 10
마이너 업그레이드 버전
C++ 표준을 더욱 더 준수
 VC++ 버전 7(2002와 동일)코드 분석 기능 추가(SAL)
64비트 컴파일 지원
 Managed C++ -> C++/CLI
 VC++ 버전 8http://jacking.tistory.com/17
 C++/CLI, SAL 보완
 MFC UI 라이브러리 추가
 멀티 스레드 디버깅 강화
 C++0x TR1 라이브러리 추가
 VC++ 버전 92002부터 시작했던  Visual Studio 체계의 마지막
Visual  Studio  2010( Visual C++ 10) 새로운 Visual Stuido시대의 시작
뭐 바뀐게 있냐? -_-
2. Visual C++ 10의 변화
Visual C++ Intellisense
 목표는 256K Memory의 16Bit DOS
Intellisense를 크게 어휘분석과 의미 해석으로 나눔
빠른 개발을 위해 ifdef를 획기적으로 이용
Intellisense컴파일러를 FEACP 라고 부름  Front End Auto Complete Parser의 약어
 당시의 CPU 속도는 100MHz 정도.드롭 다운 윈도우를 100ms 이내에. 초기화、멤버 오프셋 계산、vtable생성 생략.테스트와 점검은 악몽Ifdef때문에 많은 코드나 데이터의 의존성 문제
Ifdef지옥에 떨어졌음을 깨닫음
사람들은 Java나 C#의 Intellisense기능을 원함.
FEACP애서는 실현 불가능함1992년2009년파이날 판타지 5 (슈퍼 패미콤)파이날 판타지 13 (PS3)펜티엄 프로세스 66Mhz(1993년)인텔 i7 프로세스 4 core 3.33GhzPC의 메모리는 4메가(1995)PC의 메모리는 4기가“요즘 PC의 속도와 용량이면 하나의 컴파일러로 C++의 코드 생성과 intellisense 양쪽  모두 가능한 새로운 intellisense을 만들 수 있다.!!!”
Dev 10 – Visual C++ 10
Intellisense에 가장 중요한 기능은 “정확성”Intellisense == 커맨드 라인 컴파일러
드롭 다운으로 올바를 멤버를 얻을 수 있는 것 이상
일부러 빌드를 하지 않아도 경고를 사전에 알 수 있다.Intellisense의 Parse 중에 발견된 에러는 진짜 에러 !!!
정확성에 의해 원시 코드의 리팩토링 등 가능
장래에는 유저가 접근할 수 있는 API 제공
 C++ 원키 코드에 대한 고정밀도의 정보에 접근할 수 있도록 할 예정Visual C++ 10 IDE
VC++ 6VC++ 9젤다의 전설 – 링크의 모험(패미콤)젤다의 전설 – 신들의 트라이포스(슈퍼패미콤)VC++ 10젤다의 전설 – 시간의 오카리나(닌텐도64)
 IDE를 WPF 및 닷넷 기술로 구현
응답성, 확장성, 정확성 강화 - 기존의 ncb파일 제거, SQL Compact로 대체 - 대 규모 프로젝트도 문제 없음MSBuild개선
 Deploy  설정 가능DEMOVisual C++ 10 IDE
멀티 모니터 지원
디버깅 디버깅 하고 싶은 변수를 클릭하여 일종의 메모를 만듬. 코멘트 추가 가능
I DE 내,외에 위치 가능
 디버깅이 끝나면 보이지 않음.
 영구 저장된다.소스 코드 창 확대/축소
추가된 MFC 라이브러리Restart ManagerCTaskDialog
3. C++ 0x의 신 기능 auto
static_assert
Rvalue Reference
 lambdaC++0x 새로운 기능에 의해  C++ 사용이 편해졌고,
 언어의 표현력이 증대 되고,
 성능 향상이 이루어졌습니다.auto1. 변수 정의 때 명시적으로 type을 지정하지 않아도 된다.2. auto로 정의한 변수는 초기화할 때 type이 결정.3. 컴파일 타임 때 type이 결정.4. 템플릿 프로그래밍에 사용하면 코딩이 간편.  5. 코드 가독성이 향상
예제 코드auto NPCName = "KKamahui";cout << "NPC Name : " << NPCName << endl;auto* CharInven = new CharacterInvenInfo();typedef std::list<MCommand*> LIST_COMMAND;LIST_COMMAND::iteratoriter = m_listCommand.begin();auto iter = m_listCommand.begin();
DEMOauto
static_assertAssert는 논리적인 오류 찾기, 작업 결과 확인, 처리해야 할 오류 조건 테스트 할때 사용static_assert는 컴파일 시점에서 실체화할 템플릿의 전제 조건을 조사할 때 사용static_assert( “constant-expression”, “error-message” );“constant-expression” - 검사할 조건 식“error-message”        -조건이 false일 경우 출력할 error 메시지
예제 코드#include <iostream>using namespace std; const int MAX_LEVEL = 120; int main(){     static_assert( MAX_LEVEL <= 100, "Warring - MAX_LEVEL" );     return 0;}
예제 코드template< typename T1, intStackSize >class MYSTACK{     static_assert( StackSize >= 10, "Stack Size Error" );public :     MYSTACK() : data( new T[StackSize] )     {     }……….};
DEMOstatic_assert
Rvalue ReferenceC++ 장점 중 하나인성능은 향상 되었지만 ^^C++ 단점 중 하나인복잡함도 증가  -_-;
‘&’을 사용한 참조는 Lvalue Referenceint a = 10;int& refA = a;‘&&’을 사용한 참조는 Rvalue Referenceint&& RrefA = a;
RValue Reference의 의해 프로그램의 성능이 좋아지고낭비가 없어짐.
C++C#, Java…C
왜 성능이 좋아질까요?Move semantics
NEWNEWmove 생성자와move 대입 연산자
 move 생성자와move 대입 연산자는 암묵적으로 만들어지지 않는다.
복사 생성자는move 생성자보다 우선 한다.
대입 연산자는 move 연산자보다 우선 한다.
복사가 아닌 메모리 상에서 이동
 C++0x의 STL에는 Move semantics가 적용 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;    }
복사 생성자와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;}
VC++ 10 Beta 1의 STL의  vector
std::moveNPC npc2; NPC npc3;npc3 = npc2;NPC npc7;         NPC npc8;npc8 = std::move(npc7);
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;}
Perfect forwardingvoid 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를 포함하는 함수를 재정의
예제 코드void inner(int& i){}template <typename T> void outer(T&& t){	inner(t);}int main(){int a = 5;	outer(a);	outer(6);	return 0;}
DEMORvalue Reference
lambda간단하게 말하면 익명함수. 람다 식(람다 함수)C#에서는 람다 식 덕분에 Linq의 사용이 간편C++에서는 STL을 사용할 때와 템플릿을 사용할 때 편리함
예제 코드structFindDieUser{bool operator()  (User& tUser) const         {              return tUser.IsDie();         }};vector< User >::iteratorIter;Iter = find_if( Users.begin(), Users.end(), FindDieUser() );
예제 코드vector< User >::iteratorIter;Iter = find_if( Users.begin(),  Users.end(),            [](User& tUser) -> bool {                           return true == tUser.IsDie(); } );
람다 사용 방법[](파라메터) { 식 }int값에 50을 더한 후 반환하는 람다 함수  [](int x) { return x + 50; }
파라미터와 반환 값이 같을 때[](파라미터) { 식 }[](int x) { return x + 50; }파라미터와 반환 값이 다를 때[](파라미터) -> 반환 값 자료형{ 식 }[](int x) -> bool { return true; }반환 값이 없을 때[](파라미터) { 식 }[](int x) { ++x; }
클로져 사용int TotalMoney1 = 0;for_each( Moneys.begin(), Moneys.end(),          [&TotalMoney1](int Money)       {	  TotalMoney1 += Money;	});
클래스의 멤버 함수 호출클래스 멤버 내의 람다 식은 해당 클래스에서는 friend로 인식람다 식에서 private 멤버의 접근도 가능
예제 코드void AllSend() const{for_each( SendPackets.begin(),SendPackets.end(), [this](inti){ Send(i); }       ); }
DEMOlambda
About  Visual C++ 10

More Related Content

About Visual C++ 10