티스토리 뷰
<멜팅팟 세미나 with C++ Korea : 변화된 모던 C++, 심층분석> 온라인 세미나에 대한 간략한 메모입니다.
목차 정도 적으려고 했는데 유익한 내용이 많아서 좀 길어졌네요.
좋은 세미나 해주신 발표자님들께 정말 감사드립니다!
멜팅팟 세미나 with C++ Korea : 변화된 모던 C++, 심층분석
http://www.microsoftvirtualacademy.com/training-courses/meltingpot-with-c-korea
목차
1. 불어오는 변화의 바람 C++ 98 to C++ 11/14
2. Rvalue reference and constexpr
3. Lambda Expression & Concurrency API
1. 불어오는 변화의 바람 C++ 98 to C++ 11/14
C++ 창시자 Bjarne Stroustrup의 C++ 설계의 2가지 원칙
1. Leave no room for lower-level lanuage below C++
2. What you don't use you don't pay for (zero-overhead principle)
Bjarne Stroustrup 본인이 설계한 C++의 고성능과 고효율성으로 지구 온난화를 막는데 기여했다고 주장하는 동영상
ISO C++ Committee https://isocpp.org/std/the-committee
C++ 11/14 특징
auto
decltype
nullptr
Strongly-typed Enums
Uniform Initialization
std::initializer_list
Variadic Template
Delegating Constructors
C++ 관련 라이브러리
Boost http://www.boost.org
- CGSD https://github.com/pdpdds/CGSF
C++ AMP(Accelerated Massive Parallelism) http://msdn.microsoft.com/ko-kr/library/hh265137.aspx
2. Rvalue Reference & constexpr
1. Rvalue Reference
C++ Lvaue & Rvalue
- Lvalue : 표현식이 종료된 이후에도 없어지지 않고 지속되는 개체 (예 : 모든 변수)
- Rvalue : 표현식이 종료되면 더 이상 존재하지 않는 임시적인 개체 (예 : 상수, 임시 객체)
C++ 11 표준에 Rvalue를 참조하기 위한 Rvalue Reference (&& 참조자)가 추가됨
Rvalue Reference는 Lvalue임
1.1. Move Semantics
객체의 이동, Move 생성자, Move 대입 연산자 구현
불필요한 Rvalue 복사 과정, 이로 인한 오버헤드를 줄이기 위해 사용
std::move 함수
- Lvalue를 Rvalue로 취급하고 싶을 때 사용
1.2. Perfect Forwarding
Universal Reference, std::forward 함수 이용
Universal Reference
- && 참조자가 템플릿 함수의 템플릿 파라미터 또는 auto 타입과 함께 사용되는 경우
- Lvalue과 Rvalue를 모두 참조할 수 있는 포괄적(Universal) 레퍼런스
Reference Collapsing Rules
Reference 경합 |
Reference 붕괴 |
T& & |
T& |
T& && |
T& |
T&& & |
T& |
T&& && |
T&& |
std::forward 함수
- 파라미터를 조건에 따라 Rvalue Reference로 타입캐스팅
- Reference Collapsing Rules를 이용
Rvalue Reference에는 std::move 함수, Universal Reference에는 std::forward 함수 사용
2. Constexpr
컴파일 타임 처리과 메타 프로그래밍을 위한 한정자
컴파일 타임 처리
런타임에 수행할 작업을 컴파일 타임에 미리 수행하여 상수화
-> 컴파일 시간은 다소 늘어나지만 런타임 퍼포먼스는 증가
메타 프로그래밍
프로그램이 실행되기 전(컴파일 타임)에 최대한 많은 일을 해둠으로써 퍼포먼스 증가
constexpr 변수
- '변수의 값을 컴파일 타임에 결정하여 상수화 하겠다' 라는 의미
constexpr 함수
- 함수 파라미터에 상수식이 전달될 경우, 함수 내용을 컴파일 타임에 처리하겠다'라는 의미
- 함수 내에서는 하나의 표현식만 사용할 수 있으며, 반드시 리터럴 타입을 반환해야 함
- c++ 14 constexpr 제한 조건 완화
constexpr 관련 라이브러리
- Sprout C++ Libraries(Blero MURAKAMI) https://github.com/bolero-MURAKAMI/Sprout
3. Lambda Expression & Concurrency API
1. Lambda Expression
특징
- treats function "anonymously"
- only uses functions of a single input
- takes one or more functions as an input
- outputs a function
구문 형식
[lambda-capture]{ body }
[lambda-capture](params){ body }
[lambda-capture](params) -> ret { body }
[lambda-capture](params) mutable exception attribute -> ret { body }
constructor와 call operator를 가지고 있는 새로운 class 생성
Capture 구문에 따라 member variable이 추가됨
Function object(functor)와 거의 유사함
Capture clause가 없는 Lambda Expression
- Statelss Lambda
- 이 경우 calling convention을 사용하는 함수 포인터를 대체하여 사용할 수 있음
(stdcall, this call, cdecl) -> Win32 callback function과 호환
참고
Lambda Expressions in C++ http://msdn.microsoft.com/ko-kr/library/dd293608.aspx
Lambda Expression Syntax http://msdn.microsoft.com/ko-kr/library/dd293603.aspx
Examples of Lambda Expressions http://msdn.microsoft.com/ko-kr/library/dd293599.aspx
2. Concurrency API
Why Concurrency?
Hardware의 변화
- Free lunch is over
- Multi Core Architecture
Improve throughput
Improve responsiveness
언어 차원에서 표준화된 도구를 제공하면 Portability가 향상 됨
작업을 동시에 수행하는 방법
그들간에 통신하는 방법
C++ Hardware friendly 하지만 Hardware dependent 하지는 않음
Concurrency 기능은 Hardware dependent 한 구현이 필요
ISO C++ 표준은 개발자들이 하드웨어 세부적인 특성을 모르고도 프로그래밍 할 수 있도록 해주는 데 목적이 있음
Modern C++의 Concurrency
- A Memory Model
- A Thread library
- Support for Programming without locks
thread and async()
thread
- System(Platform) level의 thread와 일대일 대응
- 최적의 thread 개수는 여전히 미지수
async()
- 비동기로 수행 가능한 task를 생성하고, 이를 수행할 thread는 thread launcher에 위임
- 최적의 thread 개수 등은 thread launcher에게 위임(보통 thread pool)
future/promise
- Communication between tasks is handled by a future/promise pair
실천적 접근
- 반복적으로 사용되는 함수가 아니라면 Lambda Expression
- functor를 써야 하는 경우라면 Lambda Expression 우선 고려
- functor를 반복해서 써야 한다면 Namded Lambda Expression 고려
- 추상화 수준이 높은 기법부터 우선 고려
- Portability : C/C++ 표준, 혹은 그 조합을 우선 고려
- 마지막으로 대안이 없다면 범위를 제한하고 Platform API를 사용
- James Song
'Seminar' 카테고리의 다른 글
TechDays 2015 <프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~> (0) | 2016.02.08 |
---|---|
TechDays 2015 <디버깅, 어디까지 해봤니? 당신이 아마도 몰랐을 디버깅 꿀팁 공개> (0) | 2016.01.22 |
TechDays 2015 <녹슨 C++ 코드에 모던 C++로 기름칠하기> (0) | 2016.01.13 |
TechDays 2015 <.NET 2015와 C# 살짝 훔쳐보기> (0) | 2016.01.07 |
<Modern C++ Design>과 Mike Acton (0) | 2015.03.11 |
- #제럴드와인버그
- #scottmeyers
- 상속
- #레거시코드
- #세미나
- #팀개발
- #mva
- #임백준
- #EffectiveModernCpp
- #마이클페더스
- #cplusplus
- 책
- #클린코드
- #uwp
- Scott Meyers
- #프로그래밍심리학
- Effective Modern C++
- #cpp
- #로버트마틴
- #ndc
- Effective C++
- #build2016
- #알고리즘
- #csharp
- 객체 지향 설계
- #ModernCPP
- #코드최적화
- #자녀교육
- #스콧마이어스
- #techdays2015
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |