Your SlideShare is downloading. ×
Changes in c++0x
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Changes in c++0x

213
views

Published on

신입사원 교육용으로 만든 이 PT는 그러나 사용되지 않았다.

신입사원 교육용으로 만든 이 PT는 그러나 사용되지 않았다.

Published in: Education, Technology, Business

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
213
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Changes in C++11전상연
  • 2. C++11 오랫동안 C++0x로 알려졌었다. 하지만 2010년이 되어버렸긔… 0x는 16진수라 2015년까진 나올꺼란 드립이 나옴 올해 스펙이 확정되면서 C++11로 확정 많은 변화가 있지만 오늘 살펴볼 내용은 http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/ 를 정리한 내용입니다.
  • 3. C++11 New Algorithms New Container Classes Atomic Operations Type Traits Regular Expressions New Smart Pointers Multithreading Library TR1에 추가된 내용들이 대부분. Boost에 상당부분 구현되어있다. 오늘은 Core한 부분을 보겠습니다.
  • 4. Lambda Expressions [capture](parameters)->return-type {body} 함수 안에 함수를 내장 할 수 있다. Functor 를 암시적으로 만들 수 있음int main(){char s[]="Hello World!";int Uppercase = 0; //modified by the lambdafor_each(s, s+sizeof(s), [&Uppercase] (char c) {if (isupper(c))Uppercase++;});cout<< Uppercase<<" uppercase letters in: "<< s<<endl;}
  • 5. Automatic Type Deduction and decltype vector<int>::const_iterator ci = vi.begin(); 컴파일러는 사실 다 알고 있다. auto ci = vi.begin(); const vector<int> vi;// 실제로 vi.begin()이 호출되지는 않는다.typedef decltype (vi.begin()) CIT;CIT another_const_iterator;
  • 6. Uniform Initialization Syntax 초기화는 { }로 대동단결 C c {0,0}; //C++11 only. Equivalent to: C c(0,0); int* a = new int[3] { 1, 2, 0 }; class X {int a[4];public:X() : a{1,2,3,4} {} //C++11, member array initializer}; vector<string> vs={ "first", "second", "third"}; map singers = { {"Lady Gaga", "+1 (212) 555-7890"},{"Beyonce Knowles", "+1 (212) 555-0987"} }; class C {int a=7; //C++11 onlypublic:C();};
  • 7. Deleted and Defaulted Functions class X {X& operator=(const X&) = delete; // Disallow copyingX(const X&) = delete;}; X a;X b(a); // compilation error! class Y {Y& operator=(const Y&) = default; // default copysemanticsY(const Y&) = default;} 기본적인 동작을 하는 대입 연산자와 복사 생성자는 코드를 구현할 필요가 없이 컴파일러에서 알아서 만들어준다.
  • 8. nullptr char* p = nullptr;
  • 9. Delegating Constructors 생성자에서 다른 생성자를 부를 수 있다 C++98class X {int a;validate(int x) {if (0<x && x<=max) a=x; else throw bad_X(x);}public:X(int x) { validate(x); }X() { validate(42); }X(string s) { int x = lexical_cast<int>(s); validate(x); }}; C++11class X {int a;public:X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }X() :X{42} { }X(string s) :X{lexical_cast<int>(s)} { }};
  • 10. Rvalue References C++의 Reference(&)는 Lvalue reference다. A = B; A – Lvalue / B – Rvalue Rvalue reference - &&으로 표기 임시 객체를 바인딩할 수 있다 A& a_ref3 = A(); // Error!A&& a_ref4 = A(); // Ok
  • 11. Move Semantics C++03까지의 swap template <class T> swap(T& a, T& b){T tmp(a); // now we have two copies of aa = b; // now we have two copies of bb = tmp; // now we have two copies of tmp(aka a)} vector 같은 container는 멤버함수로 swap을 구현한다음에 swap에 대해서 템플릿 특화를 해야 했다 swap(vector<T>& left, vector<T>& right){ left.swap(right); } 직접 만드는 클래스도 비슷하게 구현할 수 있지만… 어떤 알고리즘에서 쓰일 줄 알고? 다 구현해야 하나?
  • 12. C++11의 swap template <class T> swap(T& a, T& b){T tmp(std::move(a));a = std::move(b);b = std::move(tmp);} std::move 는 값을 반환하는데, 원본의 값이 유지될필요가 없다 a의 값은 tmp로 넘어가고, b의 값은 a로 넘어가고, tmp의값은 다시 b로 넘어간다. 복사가 아니다.
  • 13. move를 지원하기 위해서는 class에 move contructor와 move assignment operator를 구현해야 한다. class Derived: public Base{std::vector<int> vec;std::string name;public:// …// move semanticsDerived(Derived&& x) // rvalues bind here: Base(std::move(x)),vec(std::move(x.vec)),name(std::move(x.name)){ }Derived& operator=(Derived&& x) // rvalues bind here{Base::operator=(std::move(x));vec = std::move(x.vec);name = std::move(x.name);return *this;}// …};
  • 14. 복사는 불가해도 이동은 가능한 타입이 가능 fstream unique_ptr auto_ptr이 사라지고 새로 들어감 non-shared, non-copiable ownership 기타 등등
  • 15. Perfect Forwarding Template 함수에서 인자로 넘어왔을 때 Lvalue로 넘어온건 copy하자 Rvalue로 넘어온건 move하자 Constness는 유지하자 class Widget {string name1;string name2;public:template<typename T1, typename T2>Widget(T1&& t1, T2&& t2): name1(std::forward<T1>(t1)), name2(std::forward<T2>(t2)){ }}; string GetStr() { return string("456"); } string a="123";Widget b(a, GetStr());
  • 16. 성능 비교 http://vsts2010.tistory.com/483
  • 17. static_assert #include <iostream>using namespace std;int main(){static_assert( sizeof(int) == 4, "not int size 4" );return 0;} assert와 비슷한 조건 조사를 할 수 있음 컴파일 타임 때 사용 템플릿 프로그래밍에 사용하면 유용하다
  • 18. 참고 사이트 http://vsts2010.tistory.com/ VS2010 공식 팀 블로그

×