About  Visual C++ 10
Upcoming SlideShare
Loading in...5
×
 

About Visual C++ 10

on

  • 2,002 views

KGC2009 강연

KGC2009 강연

Statistics

Views

Total Views
2,002
Views on SlideShare
2,002
Embed Views
0

Actions

Likes
1
Downloads
14
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

About  Visual C++ 10 About Visual C++ 10 Presentation Transcript

  • About Visual C++ 10
    Microsoft Visual C++ MVP
    마이에트 엔터테인먼트
    Server Programmer 최흥배
  • 2003년 1월 ~
  • 목차
    Visual C++ 6에서 Visual C++ 9…..
    Visual C++ 10의변화
    C++0x의 신 기능
    Concurrency Runtime
  • 1. Visual C++ 6 ~ 9
    • C++ 표준을 더욱 더 준수
    • UI 완전 변경
    • Managed C++
    • Visual C++ 7
    새로운 Visual Studio 시작…
    • 마이너 업그레이드 버전
    • C++ 표준을 더욱 더 준수
    • VC++ 버전 7(2002와 동일)
    • 코드 분석 기능 추가(SAL)
    • 64비트 컴파일 지원
    • Managed C++ -> C++/CLI
    • VC++ 버전 8
  • http://jacking.tistory.com/17
    • C++/CLI, SAL 보완
    • MFC UI 라이브러리 추가
    • 멀티 스레드 디버깅 강화
    • C++0x TR1 라이브러리 추가
    • VC++ 버전 9
    2002부터 시작했던 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.33Ghz
    PC의 메모리는 4메가(1995)
    PC의 메모리는 4기가
    “요즘 PC의 속도와 용량이면 하나의 컴파일러로 C++의 코드 생성과 intellisense 양쪽 모두 가능한 새로운 intellisense을 만들 수 있다.!!!”
  • Dev 10 – Visual C++ 10
    • Intellisense에 가장 중요한 기능은 “정확성”Intellisense == 커맨드 라인 컴파일러
    • 드롭 다운으로 올바를 멤버를 얻을 수 있는 것 이상
    • 일부러 빌드를 하지 않아도 경고를 사전에 알 수 있다.Intellisense의 Parse 중에 발견된 에러는 진짜 에러 !!!
    • 정확성에 의해 원시 코드의 리팩토링 등 가능
    • 장래에는 유저가 접근할 수 있는 API 제공
    • C++ 원키 코드에 대한 고정밀도의 정보에 접근할 수 있도록 할 예정
  • Visual C++ 10 IDE
  • VC++ 6
    VC++ 9
    젤다의 전설 – 링크의 모험(패미콤)
    젤다의 전설 – 신들의 트라이포스(슈퍼패미콤)
    VC++ 10
    젤다의 전설 – 시간의 오카리나(닌텐도64)
    • IDE를 WPF 및 닷넷 기술로 구현
    • 응답성, 확장성, 정확성 강화
    - 기존의 ncb파일 제거, SQL Compact로 대체
    - 대 규모 프로젝트도 문제 없음
    • MSBuild개선
    • Deploy 설정 가능
  • DEMO
    Visual C++ 10 IDE
  • 멀티 모니터 지원
  • 디버깅
    • 디버깅 하고 싶은 변수를 클릭하여 일종의 메모를 만듬. 코멘트 추가 가능
    • I DE 내,외에 위치 가능
    • 디버깅이 끝나면 보이지 않음.
    • 영구 저장된다.
  • 소스 코드 창 확대/축소
  • 추가된 MFC 라이브러리
    Restart Manager
    CTaskDialog
  • 3. C++ 0x의 신 기능
    • auto
    • static_assert
    • Rvalue Reference
    • lambda
  • C++0x 새로운 기능에 의해
    • C++ 사용이 편해졌고,
    • 언어의 표현력이 증대 되고,
    • 성능 향상이 이루어졌습니다.
  • auto
    1. 변수 정의 때 명시적으로 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();
  • DEMO
    auto
  • static_assert
    Assert는 논리적인 오류 찾기, 작업 결과 확인,
    처리해야 할 오류 조건 테스트 할때 사용
    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] )
         {
         }
    ……….
    };
  • DEMO
    static_assert
  • Rvalue Reference
    C++ 장점 중 하나인
    성능은 향상 되었지만 ^^
    C++ 단점 중 하나인
    복잡함도 증가 -_-;
  • ‘&’을 사용한 참조는 Lvalue Reference
    int a = 10;
    int& refA = a;
    ‘&&’을 사용한 참조는 Rvalue Reference
    int&& RrefA = a;
  • RValue Reference의 의해
    프로그램의 성능이 좋아지고
    낭비가 없어짐.
  • C++
    C#, Java…
    C
  • 왜 성능이 좋아질까요?
    Move semantics
  • NEW
    NEW
    • move 생성자와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::move
    NPC 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 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를 포함하는 함수를 재정의
  • 예제 코드
    void inner(int& i)
    {
    }
    template <typename T> void outer(T&& t){
    inner(t);
    }
    int main()
    {
    int a = 5;
    outer(a);
    outer(6);
    return 0;
    }
  • DEMO
    Rvalue 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); }
    );
    }
  • DEMO
    lambda
  • 4. Concurrency Runtime
  • CPU의 성능 향상은
    Multi Core로
    Ghz에서
  • 무어의 법칙은 불변이지만…
  • 소프트웨어 Free Lunch는 끝났다
  • 멀티 스레드? 멀티코어? 그거 먹는건가요? 우걱우걱
  • 현실
    이상
  • Concurrency Runtime
    병행 런타임
    • Parallel Patterns Library
    • Asynchronous Agents Library
    • Synchronization Data Structures
  • 병렬 패턴 라이브러리 ( PPL )
  • PPL의 세 가지 features
    • Task Parallelism
    • Parallel algorithms
    • Parallel containers and objects
  • Task Parallelism
    실제적인 task의 실행은 task_group에서 한다.
    unstructured_task_group(task_group) 와 structured_task_group로나누어진다.
    task_group : 스레드 세이프structured_task_group : 스레드 세이프 하지 않음.
  • Main Thread
    Main Thread
    task_group1.run( task1)
    structured_task_group1.run( task1)
    Thread A
    task_group1.run( task2)
    Thread B
    task_group1.run( task3)
    Thread A
    structured_task_group1.run( task2)
  • 초 간단!!! task 사용 방법
    ppl.h파일을 포함합니다.#include <ppl.h>
    Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;
    태스크 그룹을 정의합니다.structured_task_groupstructured_tasks;
    태스크를 정의합니다.auto structured_task1 = make_task([&] { Plus(arraynum1, true); } );
    태스크를 태스크 그룹에 추가한 후 실행합니다.  structured_tasks.run( structured_task1 );
    태스크 그룹에 있는 태스크가 완료될 때까지 기다립니다.structured_tasks.wait();
  • DEMO
    parallel_task
  • Parallel Algorithms
    데이터컬렉션을 대상으로 쉽게 병렬 작업을 할 수 있게 해주는 알고리즘들.
    C++ STL에서 제공하는 알고리즘과 비슷한 모양과 사용법.
    paeallel_for, parallel_for_each, parallel_invoke가 구현되어 있음.parallel_accumulate, parallel_partial_sum은 Beta 1에서는 아직 미 구현.
  • parallel_for
    for 문을 병렬화.
    for 문과 사용 방법이 흡사하여 쉽게 변환.
    step 값을 지정하는 버전과 지정하지 않는 버전 두 개가 있음(지정하지 않으면 1).
    index 조사는 ‘<‘만 지원.
  • 초 간단!!! parallel_for사용 법
    ppl.h파일을 포함합니다.#include <ppl.h>
    Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;
    parallel_for에서 호출할 함수 정의
    parallel_for에서 사용할 data set 정의.
    parallel_for사용.
  • parallel_for_each
    STL의 for_each알고리즘을 병렬화.
    for_each와 사용 방법이 같음.
  • 초 간단!!! parallel_for_each사용 법
    ppl.h파일을 포함합니다.#include <ppl.h>
    Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;
    parallel_for_each에서 호출할 함수 정의
    parallel_for_each에서 사용할 data set 정의.
    parallel_for_each사용.
  • parallel_invoke
    병렬로 일련의 태스크 실행.
    동시 실행할 복수의 독립된 태스크를 실행할 때 좋음.
    task_group과 비슷하나 사용방법은 더 쉬움그러나 최대 10개의 태스크만 병렬 작업이 가능하다.
  • 초 간단!!! parallel_invoke사용 법
    ppl.h파일을 포함합니다.#include <ppl.h>
    Concurrency Runtime의 네임 스페이를 선언합니다.using namespace Concurrency;
    태스크 정의
    parallel_invoke사용.
  • parallel objects - combinable
    스레드세이프한 오브젝트.
    계산 실행한 후 최종 결과에 그 계산 결과를 통합하는 재 사용 가능한 로컬 스트리지 제공.
    복수의 스레드 또는 채스크 간에 공유 리소스가 있는 경우 편리.
    lock-free thread-local sub-computations during parallel algorithms
    combinable 클래스에 사용할 데이터는 기본 생성자와 복사 생성자를 가지고 있어야 한다.
    Win32 API의 thread local storage와 비슷.
    combine, combinable_each제공
  • 예제 코드
    #include <algorithm>
    #include <iostream>
     
    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;
    });
     
    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<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;
    });
    }
  • concurrent containers
    병렬 환경에서 스레드 세이프하게 데이터를 저장.
    concurrent_queue, concurrent_vector, concurrent_hash_map.
    Beta1에서는 아직 미 구현.
  • MSDN
    http://msdn.microsoft.com/en-us/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/