티스토리 뷰

<멜팅팟 세미나 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

QT http://qt-project.org

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

댓글