PowerPoint 프레젠테이션

Similar documents
PowerPoint 프레젠테이션

K&R2 Reference Manual 번역본

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

PowerPoint Template

금오공대 컴퓨터공학전공 강의자료

03장.스택.key

Microsoft PowerPoint - C++ 5 .pptx

C프로-3장c03逞풚

PowerPoint 프레젠테이션

chap10.PDF

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - [2009] 02.pptx

컴파일러

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint Presentation

제 1 장 기본 개념

슬라이드 1

PowerPoint 프레젠테이션

C++ Programming

PowerPoint 프레젠테이션

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

C++ Programming

Microsoft PowerPoint - chap12-고급기능.pptx

Modern Javascript

Microsoft PowerPoint - additional01.ppt [호환 모드]

제4장 기본 의미구조 (Basic Semantics)

Microsoft PowerPoint - chap10-함수의활용.pptx

5.스택(강의자료).key

초보자를 위한 C# 21일 완성

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chap12-OOP.ppt

슬라이드 1

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

chap 5: Trees

Microsoft PowerPoint - lec2.ppt

Microsoft PowerPoint - additional06.ppt [호환 모드]

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을


Microsoft PowerPoint - chap05-제어문.pptx

chap x: G입력

슬라이드 1

C++-¿Ïº®Çؼ³10Àå

설계란 무엇인가?

1. 인라인함수 예 : x, y 값중최소값을반환하는매크로와함수작성 // 매크로로구현한경우 #define MIN(X, Y) ((X) < (Y)? (X) : (Y)) X, Y 각각을괄호 ( ) 안에넣는이유는? // 함수로구현한경우 cout << MIN(4, 5) << en

02장.배열과 클래스

Microsoft PowerPoint - ch07 - 포인터 pm0415

chap x: G입력

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

OCW_C언어 기초

강의10

슬라이드 1

OCW_C언어 기초

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

PowerPoint Template

2002년 2학기 자료구조

슬라이드 1

Microsoft PowerPoint - CSharp-10-예외처리

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

C 프로그래밊 개요

Microsoft PowerPoint - additional-11_13l.ppt [호환 모드]

Slide 1

untitled

UI TASK & KEY EVENT

OCaml

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

슬라이드 1

Microsoft PowerPoint - Chapter 1-rev

Microsoft PowerPoint - Chapter_04.pptx

PowerPoint 프레젠테이션

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - chap03-변수와데이터형.pptx

17장 클래스와 메소드

C 프로그래밊 개요


0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

3장 함수

Microsoft PowerPoint - chap06-2pointer.ppt

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

02 C h a p t e r Java

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

슬라이드 1

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

쉽게 풀어쓴 C 프로그래밍

Lab 3. 실습문제 (Single linked list)_해답.hwp

TEST BANK & SOLUTION

슬라이드 1

Transcription:

SIGPL Summer Workshop 2017 C++ 메타프로그래밍과 constexpr 김경진 Astersoft Microsoft MVP(Visual C++)

Agenda 메타프로그래밍 템플릿메타프로그래밍 constexpr

메타프로그래밍 meta- < 초월한 > < ~ 의범주를넘어서는 >

메타프로그래밍 metaphysics 일반적물리학범주를넘어서는학문 형이상학 metaprogramming 일반적프로그래밍의범주를넘어서는프로그래밍 기존프로그래밍과는다른무언가를의미

메타프로그래밍 일반적프로그래밍 사용자의데이터를처리하고가공하는프로그램을만드는것 메타프로그래밍 프로그램을데이터로처리하고가공하는프로그램을만드는것 예 ) C++ 컴파일러, YACC 파서생성기

C++ 메타프로그래밍 일반적프로그래밍 런타임에수행할작업을프로그래밍하는것 메타프로그래밍 컴파일타임에수행할작업을프로그래밍하는것

Why C++ Metaprogramming? 런타임에수행할작업을컴파일타임에미리수행하여상수화 컴파일시간은다소늘어나지만런타임퍼포먼스는증가 계산결과가언어와더밀접하게상호작용가능 계산결과를배열의크기와같은상수에사용가능

템플릿메타프로그래밍의탄생 1994 년 Erwin Unruh 의우연한발견 템플릿을이용한미완의소수계산코드구현

템플릿메타프로그래밍의탄생 Error "primes.cpp",l16/c63(#416): prim Type `enum} can t be converted to txpe `D<2> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<3> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<5> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<7> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<11> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<13> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<17> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<19> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<23> ("primes.cpp",l2/c25). Error "primes.cpp",l11/c25(#416): prim Type `enum} can t be converted to txpe `D<29> ("primes.cpp",l2/c25). 런타임이아닌컴파일타임에무언가를계산할수있다 는가능성을보여줌

타입다루기 템플릿은특정타입에의존하지않고재사용성을 높이기위한목적으로만들어짐 템플릿인자 : 타입 template <typemame T>

타입다루기 Demo

is_same_type template <typename T1, typename T2> struct is_same_type enum value = false }; }; template <typename T> struct is_same_type<t, T> enum value = true }; }; int main() cout << is_same_type<int, double>::value << endl; cout << is_same_type<int, int>::value << endl; } 0 1

type_traits Primary Type Composite Type Type Properties Type Relationships is_null_pointer is_fundamental is_const is_same is_integral is_arithmetic is_volatile is_base_of is_floating_point is_scalar is_trivial is_convertible is_array is_object is_trivially_copyable is_invocable is_enum is_compound is_standard_layout is_nothrow_invocable is_union is_reference is_pod is_function is_member_pointer is_literal_type is_pointer is_empty is_lvalue_reference is_polymorphic

type_traits 활용예 template <typename T> void foo(const T& data) static_assert(std::is_integral<t>::value, "Template argument must be a integral type."); } int main() foo(1.5); // Compile Error } error C2338: Template argument must be a integral type.

데이터다루기 템플릿인자에는타입뿐만아니라데이터역시 사용이가능함 템플릿인자 : 데이터 template <int val>

데이터다루기 Demo

add / substract template <int left, int right> struct add enum value = left + right }; }; template <int left, int right> struct substract enum value = left - right }; }; int main() cout << add<10, 20>::value << endl; cout << substract<10, 20>::value << endl; } 30-10

factorial template <int val> struct factorial enum value = val * factorial<val - 1>::value }; }; template <> struct factorial<0> enum value = 1 }; }; int main() cout << factorial<10>::value << endl; } 3628800

fibonacci_number template <int val> struct finonacci_number enum value = finonacci_number<val - 1>::value + finonacci_number<val - 2>::value }; }; template <> struct finonacci_number<0> enum value = 0 }; }; template <> struct finonacci_number<1> enum value = 1 }; }; int main() cout << finonacci_number<10>::value << endl; } 55

is_prime struct false_type typedef false_type type; enum value = 0 }; }; struct true_type typedef true_type type; enum value = 1 }; }; template<bool condition, class T, class U> struct if_ typedef U type; }; template <class T, class U> struct if_ < true, T, U > typedef T type; }; template<size_t N, size_t c> struct is_prime_impl typedef typename if_<(c*c > N), true_type, typename if_ < (N % c == 0), false_type, is_prime_impl<n, c + 1> > ::type > ::type type; enum value = type::value }; }; template<size_t N> struct is_prime enum value = is_prime_impl<n, 2>::type::value }; }; template <> struct is_prime <0> enum value = 0 }; }; template <> struct is_prime <1> enum value = 0 }; };

템플릿메타프로그래밍의한계 컴파일타임계산만가능 가독성이매우낮음

vector<vector<int>> user-defined literals thread_local vector<localtype> initializer lists constexpr template aliases lambdas [] foo(); } unique_ptr<t> shared_ptr<t> weak_ptr<t> nullptr =default, =delete regex C++ raw string literals override, final auto i = v.begin(); thread, mutex for (x : coll) async atomic<t> variadic templates template <typename T > function<> strongly-typed enums enum class E }; auto f() -> int array<t, N> noexcept decltype extern template unordered_map<int, string> delegating constructors rvalue references (move semantics) future<t> static_assert(x) tuple<int, float, string>

constexpr specifier const, static 과용법이같은한정자 ( 변수, 함수에사용 ) 컴파일타임에값을도출하겠다 라는의미를부여 C++ 메타프로그래밍을문법차원에서지원

constexpr 변수 변수의값을컴파일타임에결정하여상수화하겠다 라는의미 반드시상수식으로초기화되어야함 constexpr int n = 0; constexpr int m = std::time(null); // OK // error C2127

constexpr 함수 함수파라미터에상수식이전달될경우, 함수내용을 컴파일타임에처리하겠다 라는의미 constexpr int square(int x) return x * x; } 전달되는파라미터에따라컴파일타임, 런타임처리가결정됨 int n; std::cin >> n; square(10); square(n); // 컴파일타임처리 // 런타임처리

constexpr 함수제한조건 함수내에서는하나의표현식만사용할수있으며, 반드시리터럴타입을반환해야함 * 리터럴타입 : 정수, 부동소수, 열거형, 포인터, 참조등의타입을지칭 constexpr LiteralType func() return expression; }

constexpr 함수로변환 if / else 구문 삼항연산자 (x > y? x : y) for / while 루프 재귀호출 변수선언 파라미터전달

constexpr 을이용한메타프로그래밍 Demo

factorial constexpr int factorial(int n) return n == 0? 1 : n * factorial(n - 1); } int main() int n; std::cin >> n; } constexpr int c_result = factorial(10); int r_result = factorial(n);

fibonacci_number constexpr int fibonacci_number(int n) return n <= 1? n : fibonacci_number(n - 1) + fibonacci_number(n - 2); } int main() int n; std::cin >> n; } constexpr int c_result = fibonacci_number(10); int r_result = fibonacci_number(n);

is_prime constexpr bool is_prime(int n, int i = 2) return n <= 1? false : i * i > n? true : n % i == 0? false : is_prime(n, i + 1); } int main() int n; std::cin >> n; } constexpr bool c_result = is_prime(13); bool r_result = is_prime(n);

컴파일타임문자열해시 constexpr unsigned int hash_code(const char* str) return str[0]? static_cast<unsigned int>(str[0]) + 0xEDB8832Full * hash_code(str + 1) : 8603; }

컴파일타임문자열해시 constexpr unsigned int hash_code(const char* str) return str[0]? static_cast<unsigned int>(str[0]) + 0xEDB8832Full * hash_code(str + 1) : 8603; } void foo(const char* name) switch (hash_code(name)) case hash_code("kim"): break; } } case hash_code("lee"): break;

C++14 constexpr 제한조건완화 변수선언가능 (static, thread_local 제외 ) if / switch 분기문사용가능 range-based for 루프를포함한모든반복문사용가능

is_prime C++14 ver. constexpr bool is_prime(int n) if (n <= 1) return false; } for (int i = 2; i * i <= n; ++i) if (n % i == 0) return false; } return true;

constexpr 관련라이브러리 Sprout C++ Libraries (Bolero MURAKAMI) http://bolero-murakami.github.io/sprout/ CEL constexpr Library (@sscrisk) https://github.com/sscrisk/cel---constexpr-library

참고자료 C++ Template Metaprogramming (David Abrahams, Aleksey Gurtovoy) http://blogs.embarcadero.com/jtembarcadero/2012/11/12/my-top-5-c11-language-and-library-features-countdown/ http://en.cppreference.com/w/cpp/language/constexpr http://en.cppreference.com/w/cpp/language/constexpr http://blog.smartbear.com/c-plus-plus/using-constexpr-to-improve-security-performance-and-encapsulation-in-c/ http://www.codeproject.com/articles/417719/constants-and-constant-expressions-in-cplusplus http://cpptruths.blogspot.kr/2011/07/want-speed-use-constexpr-meta.html http://enki-tech.blogspot.kr/2012/09/c11-compile-time-calculator-with.html http://en.wikipedia.org/wiki/c%2b%2b14 https://www.slideshare.net/embo_conference/programming-at-compile-time