C++ 프로그래밍

Visual Studio 2010에 적용 예정인 C++0x

하늘흐늘 2009. 7. 21. 14:53
반응형

우선 이 글은

MS Visual Studio Team System 2010 공식 팀 블로그

에 있는 내용을 한 페이지에 볼 수 있게 요약한 것입니다. 자의적으로 요약한 만큼 잘못된 설명이 존재할 수 있으며 좀 더 궁금한 부분은 해당 페이지를 참조하여 주시면 됩니다.


auto
컴파일 시간에 컴파일러가 자동으로 타입을 유추하여 코드를 생성시켜 주는 새로운 키워드 입니다.
예제 보니 가장 많이 쓰일 곳이 STL 코드내일 듯 보입니다.

for( auto IterPos = ItemCodeList.begin(); IterPos != ItemCodeList.end(); ++IterPos)

{
        cout << "ItemCode : " << *IterPos << endl;
}
cout << endl;


static_assert

컴파일 시간용 assert으로 지금은 template을 이용하여 사용하는 것을 정식으로 지원 합니다. 컴파일 시간용 assert은 template과 같이 사용할 때 여러모로 유용하며 생산성을 높여줍니다.

template
class MYSTACK
{
static_assert( StackSize <= 10, "Stack Size Error" );

public :
     MYSTACK() : data( new T[StackSize] )
     {
     }
...

우측값 참조, 이동 연산자(&&)
복사 생성자가 자신의 메모리로 데이터를 카피하는 것이 주 목적이라면 이동 연산자는 자신의 메모리로 데이터를 이동하는 것을 주 목적으로 하는 연산자입니다. 아래 예제에서는 이동 연산자와 같은 경우는 Name의 메모리를 이동하고 원래 메모리를 지칭하는 포인터를 0으로 만들었습니다. 이동 연산자는 STL컬렉션을 다룰 때 성능을 높여줄 듯 합니다.

class QuestInfo
{
public:
    // 복사 생성자
    QuestInfo(const QuestInfo& quest)
       : Name(new char[quest.NameLen]), NameLen(quest.NameLen)
    {
        memcpy(Name, quest.Name, quest.NameLen);
    }

	  // 대입 연산자
    QuestInfo& operator=(const QuestInfo& quest)
    {
      if (this != &quest) {
        if (NameLen < quest.NameLen) 
        {
          // 버퍼를 확보한다
        }
        NameLen = quest.NameLen;
        memcpy(Name, quest.Name, NameLen);
      }
      
      return *this;
    }

    // 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;
    }

private:
    char*  Name;
    int NameLen;
};

우측값 참조, 이동 연산자
Lamda는 무명함수를 지칭하는 용어로 쉽게 이야기 하면 선언이나 정의가 코드 내에서 쉽게 이루어지는 함수라고 할 수 있을 듯 합니다. stl을 좀 더 편하게 사용하기 위하여 쓰면 될 듯 합니다.

int main()
{
   vector< User > Users;
   vector< User >::iterator Iter;
   
   Iter = find_if( Users.begin(), 
                   Users.end(), 
                   [](User& tUser) -> bool { return true == tUser.IsDie(); } //Lamda
                 );
   cout << "found Die User Index : " << Iter->GetIndex() << endl;
   
   
   return 0;
}

decltype
컴파일 시간에 컴파일러가 변수의 타입을 바탕으로 해당 타입을 유추하여 줍니다.

int Hp;
decltype(Hp) NPCHp = 5;
decltype(Hp + NPCHp) TotalHp;
decltype(Hp*) pHp = &Hp;
반응형