C++11
NHN NEXT 이선협
C++11
 ISO(국제 표준 기구)에서 2011년 8월 12일에 승인된 C++ 프로그래밍 언어의 최신판.
 새로운 표준 문법이 추가됨
 최근 C++14가 등장
 키워드를 통해 Step By Step으로 진행
auto
auto
 대입되는 값의 자료형에 따라 변수의 타입이 정할 수 있는 키워드
 네이밍이 긴 클래스 혹은 템플릿을 이용하여 변수형이 길어질 경우에 유용하다.
이 경우에는 n은 int형이다 이런 경우는 없겠지만 이렇게 길면 난감..
auto
 이런 상황에 유용하다
auto
 Range for와 함께 사용하면 더 좋다
코드가 상당히 많이 단축되었다
Range for
Range for
 다른 언어의 for each와 같다.
 전 프로젝트 처럼 list형 자료형 뿐만 아니라 배열도 가능하다.
 프로그래머가 범위를 착각하여 댕글링 포인터를 가르킬 가능성을 줄여준다.
lambda
lambda
 C++에 원래 없던 익명 함수기능.
 단지 정렬하기 위해 operator 함수를 만드는 행위를 하지 않아도 된다.
lambda
역순으로 정렬하기 위해 compare 함수를 만들었다 한두번 쓰고 말 함수 그냥 이렇게 쓰자!
lambda
lambda
Error
or
lambda
 Capture
enum class
enum class
 기존의 enum은 type이 not type-safe하다. 기본적으로 정수형 타입을 가지고 있기 때문이다.
 그리고 모든 데이터가 4바이트라는 문제점이 있다.
enum class
 다음과 같은 코드는 C++03의 enum이 왜 위험한지를 알려준다.
enum class
 컴파일 단계에서 서로 다른 것을 걸러내기 때문에 프로그래머의 실수를 막아준다.
enum class
 C++11의 enum은 자료형을 바꿀 수 있다.
nullptr
nullptr
 기존 NULL의 문제점은 상수 0과 NULL이 같다는 점이다.
 nullptr은 NULL이 상수였기 때문에 만들어지는 이상한 코드를 예방시켜준다.
True
nullptr
NULL이 상수라서 가능한 코드 NULL이 상수라서 가능한 코드
std::array
std::array
 기존의 배열은 범위를 벗어난 잘못된 메모리 접근이 일어날 수 있다.
 하지만 std::array는 기존의 배열을 대체할 수 있는 안전한 배열 타입이다.
 vector와 달리 크기가 고정되어 새로운 항목을 추가할 수 없지만 오버헤드가 적다.
std::array
 다음과 같이 사용 가능하다.
std::forward_list
std::forward_list
 기존의 STL은 더블링크드리스트인 std::list만 지원했다.
 C++11이 등장하면서 싱글링크드리스트인 std::forward_list가 등장했다.
 당연히 std::list보다 메모리를 적게 사용한다.
 한 방향으로만 순회가 가능하다.
std::forward_list
 다음과 같이 사용 가능하다.
std::unordered_...
std::unordered_...
 std::unordered_set
 std::unordered_map
 std::unordered_multiset
 std::unordered_multimap
 위 4가지가 추가되었다.
 기존의 set, map, ...등과 다른 점은 자료구조과 해시 테이블로 바뀌었다는 점이다.
 기존의 set, map이 O(log n)으로 접근한다면 std::unordered_...은 최소 O(1), 최대 O(n)이 걸린다.
std::unordered_...
 기존과 사용방법은 같지만 내부 동작 방식만 다르다.
std::tuple
std::tuple
 2개 이상의 다른 데이터 타입을 하나로 묶을 수 있다.
 2개 이상의 리턴 값이 필요할 때 사용할 수 있다.
std::tuple
std::tuple
shared_ptr
shared_ptr
 객체의 소유권이 카피가 가능하도록 만들어진 포인터
 레퍼런스 카운팅 방식을 사용하고 있다. (Object-C, Cocos2d-x, ...)
 특정 포인터를 복사한 shared_ptr 객체가 모두 제거가되면 (레퍼런스 카운트가 0이면) 해당 포인터
를 가르키는 메모리가 free 된다.
shared_ptr
 reset()은 해당 메모리를 free하겠다는 뜻이다.
p1.reset()을 하더라도 p2는 int(10)을 바라보고 있기 때문에 완전히 해제되지 않는다.
p2.reset()을 해야 레퍼런스 카운트가 0이되어 메모리가 해제된다.
unique_ptr
unique_ptr
 객체의 소유권이 오직 한 포인터만 가질 수 있는 스마트 포인터
unique_ptr
에러 발생
unique_ptr
 malloc으로 할당할 경우 custom deleter가 필요하다.
 출처 : http://bunhere.tistory.com/407
std::chrono
std::chrono
 시간을 측정하는 라이브러리
 나노 밀리 초 단위도 측정할 수 있다.
std::chrono
 다양한 시간으로 변환 가능
 출처 : http://jacking.tistory.com/988
C++11 thread
std::thread
 쉽게 쓰레드를 만들 수 있다.
 아래 코드만으로는 동기화가 되지 않는다.
std::thread
std::thread
sleep_for, sleep_until
std::mutex
 쓰레드를 동기화하지 않으면 데이터가 변할 위험이 있다.
 그럴 위험이 있을 경우 mutex를 사용한다.
데이터가 변하는 코드
한 객체를 여러 쓰레드에서 사용하기 때문
std::mutex
 mutex를 사용하면 안전해진다.
std::lock
 mutex만으로는 데드락이 발생할 가능성이 높다.
데드락 걸리는 코드
std::lock
 std::lock을 이용하면 동시에 lock하기 때문에 안전하다.
call_once
프로세스 동작 중 한번만 실행 가능
lock_guard
 생성될 때 lock
 소멸할 때 unlock
여러가지 동기화 방법...
 unique_lock, recursive_mutex, timed_mutex, recursive_timed_mutex ...
너무 많다!!
 알아서 공부해봅시다.
std::async, std::future
 std::async
 함수를 비동기로 호출 할 수 있도록 해준다.
 std::future
 선언 당시에는 아무런 값도 가지고 있지 않지만 후에 가지게 될 경우에 사용한다.
std::async, std::future
동기라면 2초 걸릴작업이 1초만에 작업 완료
launch를 deferred로 바꿔주면
future::get을 실행할때 함수가 동작함
참고 자료
 http://bunhere.tistory.com/407
 http://wonderfuldream.tistory.com/333
 http://bab2min.tistory.com/335
 http://blog.naver.com/hextrial?Redirect=Log&logNo=60205904579
 http://jacking.tistory.com/tag/VC11
감사합니다

C++11