18장 표현식 템플릿 Ver 2.01.

Slides:



Advertisements
Similar presentations
 수학 10- 나  1 학년 2 학기  Ⅰ. 도형의 방정식 1. 평면좌표 (1/24) 두 점 사이의 거리 수업 계획 수업 활동.
Advertisements

라오디게아 교회의 교훈 본문 계 3: ○라오디게아 교회의 사자에게 편지하라 아멘이시요 충성되고 참된 증인이시요 하나님의 창조의 근본이신 이가 이르시되 15. 내가 네 행위를 아노니 네가 차지도 아니하고 뜨겁지도 아니하도다 네가 차든지 뜨겁든지 하기를 원하노라.
다문화가정의 가정폭력의 문제점 연세대학교 행정대학원 정치행정리더십 2학기 학번 이름 홍 진옥.
예수의 제자들 담당교수 : 김동욱.
[ 한옥 실측 ] 1. 약실측 2. 정밀실측 조선건축사사무소.
A제조용수/B환경관리/C시설관리 ㈜ 에이플러스 코리아
신종플루 [A(H1N1)] 건강하게 극복하기 A[H1N1] Attack.
온라인 마케팅 제안서 2011년 6월 마케팅1팀 > 김태호 과장 HP :
교육학개론 2조 강재현 황소정 연미란 이호 장윤정 이아림 김효연
안재홍선생님의관한글 - Windows 3-1반 조범기- 한번넘겨보세요!.
문학의 세계 01 견우의 노래 02 황만근은 이렇게 말했다 03 토막 04 한중록.
취업정보 홈페이지 (job.inha.ac.kr)
Ⅸ 대한민국의 발전과 국제 정세의 변화 주제3 산업화와 대중문화의 발달.
농산물 무역론 정보분석 韓-칠레 FTA 그 이후 발표일 2004년 09월 21일 화요일 제 5 조 이 준 복 김 남 형
LGT 산업 분석 경북대학교 경영대학원 경 영 학 과 10조 산 김미정 김상구
사업계획서 추억을 만드는 기업 ㈜아이포토 인터넷경영정보 2-M 강미선 서남희
1. 시로 표현하는 세상 (2) 시의 표현 작가·작품 자세히 보기.
남한 언론에서 보여지는 러시아의 모습.
엘리제를 위하여(베토벤).
글로벌 경영 환경 인재교육원
노 동 법 토 막 상 식 공인노무사 황 인 용.
5월 6일 유소년부 어린이주일 예배 찬양 율동 1. 주의 자비가 내려와 2.슈퍼스타 예수 3.온 맘 다해.
2. 석촌호수 수위 및 공급량, 지하수위 측정값 ■ 석촌호수 수위 및 공급량 ■ 지하수위 측정값 5,
중앙아시아의 경제 현황과 발전 전망 2008년 9월 18일 이 재 영.
어서와 Java는 처음이지! 제3장선택과 반복.
(2009년 1월 25일) 설날감사예배 우리는 하나님의 동역자입니다(고전 3:9).
조합원과 함께 하는 성폭력예방교육 -피해자 중심 사건처리에 대하여- 전국여성위원장 강보선.
파동방정식.
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express Slide 1 (of 34)
C++ Espresso 제1장 기초 사항.
강좌명 : C++프로그래밍 (C++ Programming)
8. 객체와 클래스 (기본).
10장 템플릿과 표준 템플릿 라이브러리(STL)
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
명품 C++ 8장 상속.
6. 기본 클래스 프로그래밍 6 컴퓨터공학과 신동일.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
7장 클래스.
Visual C++ Programming Common Controls
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
명품 C++ 프로그래밍 1장. C++ 시작.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 3 클래스. 최호성.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
추상 데이터 타입 정의하기 Defining abstract data types
가상함수와 추상 클래스.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
3장. 클래스의 기본.
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
목차 성능과 최적화. 메모리할당. STL 알고리즘. 책의 성능 단원과 다른 단원들을 함께 포괄적으로 발표를 진행 하겠습니다.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
3장,4장 발표 서정우.
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
6장 클래스(상속).
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
10장 템플릿과 표준 템플릿 라이브러리(STL)
Chapter 14. 템플릿(Template) 2
실습과제 1번 /* 1. 멤버 변수로 반경 radius를 갖고, 그 값을 모니터에 출력하는
노인학대예방 교육 교육강사 시 설 장 송나겸 보성실버센터.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
C++ 언어의 특징
발 표 자 : 7조 손 창 국 윤 오 성, 박 진 완 객체 지향 프로그래밍 C++
Presentation transcript:

18장 표현식 템플릿 Ver 2.01

이 내용은 매우 어려우므로 정신적인 스트레스가 동반될 수 있습니다. 임산부나 노약자는 삼가해 주시기 바랍니다 경고 이 내용은 매우 어려우므로 정신적인 스트레스가 동반될 수 있습니다. 임산부나 노약자는 삼가해 주시기 바랍니다

용어 설명 더러운 코드 : 복잡하거나 직관적으로 보기 어려운 코드 어쩌라고 : 어떤 문제점의 대안이 또 다른 문제점을 야기 했을 때 감탄사

표현식 템플릿 int main() { SArray<double> x(1000), y(1000); //... x = 1.2*x + x*y; } 이런 종류의 연산을 빠르게 처리해 보자

표현식 템플릿 표현식 템플릿 숫자 배열 클래스를 지원하기 위해 고안된 템플릿 프로그래밍 기술 표현식 템플릿과 템플릿 메타프로그래밍이 유사함 재귀적 인스턴스화 템플릿 메타프로그래밍 - 작고 고정된 크기 배열 연산 표현식 템플릿 - 중간에서 큰 크기의 배열을 실시간으로 연산

진행 순서 단순 배열 클래스 구현하여 배열 연산 문제 제기 표현식 템플릿 구현 표현식 템플릿을 아는 랩퍼클래스와 연산자 구현 실재 표현식 템플릿 사용해서 동작 방법 추적

단순 배열 클래스 배열처럼 사용할 수 있는 클래스 만들어 봅시다 생성자 복사생성자 소멸자 할당연산자 크기반환 인덱스[] 연산자 배열처럼 사용할 수 있는 클래스 만들어 봅시다 생성자 복사생성자 소멸자 할당연산자 크기반환 인덱스[] 연산자 클래스이면 당연히 있어야 할 것 배열처럼 사용하기에 있어야 할 것

단순 배열 클래스 template<typename T> class SArray { public: explicit SArray (size_t s) //생성자 : storage(new T[s]), storage_size(s) init(); }

단순 배열 클래스 SArray (SArray<T>const& orig ) //복사생성자 :storage(new T[orig.size()]) ,storage_size(orig.size()) { copy(orig); }

단순 배열 클래스 ~SArray() //소멸자 { delete[] storage; }

단순 배열 클래스 //할당연산자 SArray<T>& operator= (SArray<T>const& orig) { if (&orig!=this) copy(orig); } return *this;

단순 배열 클래스 //크기반환 size_t size() const { return storage_size; }

단순 배열 클래스 //인덱스연산자 T operator[] (size_t idx) const { return storage[idx]; } T& operator[] (size_t idx)

단순 배열 클래스 protected: //생성자 보조함수 void init() { for (size_t idx = 0; idx<size(); ++idx) storage[idx] = T(); }

단순 배열 클래스 //복사 생성자와 할당 연산자 보조함수 void copy (SArray<T> const& orig) { assert(size()==orig.size()); for (size_t idx = 0; idx<size(); ++idx) storage[idx] = orig.storage[idx]; }

단순 배열 클래스 //멤버변수 private: T* storage; size_t storage_size; };

단순 배열 클래스 덧셈연산 template<typename T> SArray<T> operator+ (SArray<T> const& a, SArray<T> const& b) { SArray<T> result(a.size()); for (size_t k = 0; k<a.size(); ++k) { result[k] = a[k]+b[k]; } return result; 배열…

단순 배열 클래스 곱셈연산 template<typename T> SArray<T> operator* (SArray<T> const& a, SArray<T> const& b) { SArray<T> result(a.size()); for (size_t k = 0; k<a.size(); ++k) { result[k] = a[k]*b[k]; } return result; 배열…

단순 배열 클래스 스칼라와 곱셈연산 template<typename T> SArray<T> operator* (T const& s, SArray<T> const& a) { SArray<T> result(a.size()); for (size_t k = 0; k<a.size(); ++k) { result[k] = s*a[k]; } return result; 배열…

단순 배열 클래스 int main() { SArray<double> x(1000), y(1000); //... x = 1.2*x + x*y; }

단순 배열 클래스 비효율 연산자의 모든 응용(할당 제외)은 적어도 하나의 임시 배열을 생성 연산자의 모든 응용은 인자와 결과 배열에 대해 부가적으로 탐색

단순 배열 클래스 tmp1 = 1.2*x; //1000번의 연산 위한 루프 //tmp1 생성하고 소멸 tmp2 = x*y; //1000번의 연산 위한 루프 //tmp2 생성하고 소멸 tmp3 = tmp1+tmp2; //1000번의 연산 위한 루프 //tmp3 생성하고 소멸 x = tmp3; // 1000번 읽기 연산 // 1000번 쓰기 연산

임시배열을 줄여보자 +,* 연산 대신 +=, *= 연산으로 임시배열을 줄여보자

단순 배열 클래스 template<class T> SArray<T>& SArray<T>::operator+= (SArray<T> const& b) { for (size_t k = 0; k<size(); ++k) { (*this)[k] += b[k]; } return *this;

단순 배열 클래스 template<class T> SArray<T>& SArray<T>::operator*= (SArray<T> const& b) { for (size_t k = 0; k<size(); ++k) { (*this)[k] *= b[k]; } return *this;

단순 배열 클래스 template<class T> SArray<T>& SArray<T>::operator*= (T const& s) { for (size_t k = 0; k<size(); ++k) { (*this)[k] *= s; } return *this;

단순 배열 클래스 int main() { SArray<double> x(1000), y(1000); //... // process x = 1.2*x + x*y SArray<double> tmp(x); tmp *= y; x *= 1.2; x += tmp; }

단순 배열 클래스 문제점 표기방식이 보기에 이상하다 여전히 임시 tmp라는 배열이 필요하다 루프가 많은 연산에 분할돼 있기 때문에 메모리에서 double 요소를 읽는 횟수가 대략 6000회, double를 메모리에 쓰는 횟수는 4000번에 달함

아 놔~! 어쩌라고~!

우리가 원하는 계산 방식 int main() { SArray <double> x(1000), y(1000); //... for ( int idx = 0; idx < x.size(); ++idx ) x[idx] = 1.2*x[idx] + x[idx]*y[idx]; }

이걸 어떻게 해~!

진행 순서 단순 배열 클래스 구현하여 배열 연산 문제 제기 표현식 템플릿 구현 표현식 템플릿을 아는 랩퍼클래스와 연산자 구현 실재 표현식 템플릿 사용해서 동작 방법 추적

템플릿 인자에 표현식 표현 전체 표현식을 다 읽기 전에 표현식의 일부만 계산하지 않는다면 해결할 수 있다 (이번 예에서 할당 연산자 호출 될 때 까지) 계산 하기 전에 어떤 객체에 무슨 연산이 적용 됐는지 기록해둬야 한다 P.327

템플릿 인자에 표현식 표현 + A_Add * * A_Mult A_Scalar 1.2 x x y

( ( ) ( ) ) + * 1.2 x * x y 템플릿 인자에 표현식 표현 Prifix 트리 순회 방식 A_Add A_Mult A_Scalar A_Mult

템플릿 인자에 표현식 표현 1.2*x + x*y; 계산 결과 데이터 타입 A_Add< A_Mult<A_Scalar<double>,Array<double> >, A_Mult<Array<double>,Array<double> > > 아 이거 왜케 더럽게 생겼냐?

뚫어지게 쳐다봐 주세요~!

표현식 템플릿의 피연산자 template <typename T, typename OP1, typename OP2> class A_Add { private: // 나중에 알려드립니다 typename A_Traits<OP1>::ExprRef op1; typename A_Traits<OP2>::ExprRef op2;

표현식 템플릿의 피연산자 public: //생성자 //두개의 피연산자를 저장합니다 A_Add (OP1 const& a, OP2 const& b) : op1(a), op2(b) { }

표현식 템플릿의 피연산자 //할당 연산자 T operator[] (size_t idx) const { return op1[idx] + op2[idx]; } //계산 하기 전에 어떤 객체에 무슨 연산이 적용됐는지 기록해둬야 한다

표현식 템플릿의 피연산자 size_t size() const { assert (op1.size()==0 || op2.size()==0 || op1.size()==op2.size() ); return op1.size()!=0 ? op1.size() : op2.size(); } };

표현식 템플릿의 피연산자 template <typename T, typename OP1, typename OP2> class A_Mult { private: //나중에.. typename A_Traits<OP1>::ExprRef op1; typename A_Traits<OP2>::ExprRef op2;

표현식 템플릿의 피연산자 public: //생성자 //두개의 피연산자를 저장합니다 A_Mult (OP1 const& a, OP2 const& b) : op1(a), op2(b) { }

표현식 템플릿의 피연산자 //할당 연산자 T operator[] (size_t idx) const { return op1[idx] * op2[idx]; } //계산 하기 전에 어떤 객체에 무슨 연산이 적용됐는지 기록해둬야 한다

표현식 템플릿의 피연산자 size_t size() const { assert (op1.size()==0 || op2.size()==0 || op1.size()==op2.size() ); return op1.size()!=0 ? op1.size() : op2.size(); } };

표현식 템플릿의 피연산자 template <typename T> class A_Scalar { private: T const& s; public: A_Scalar (T const& v) : s(v) { } T operator[] (size_t) const { return s; } size_t size() const { return 0; }; };

표현식 템플릿의 피연산자 계산 하기 전에 어떤 객체에 무슨 연산이 적용 됐는지 기록해둬야 한다 T operator[] (size_t idx) const { return op1[idx] + op2[idx]; } { return op1[idx] * op2[idx]; }

A_Add, A_Mult 의미 외부 내부 두 피연산자 인 배열객체가 연산된 결과를 담고 있는 클래스 두 피연산자를 저장하고 어떤 연산을 하는지 기록된 클래스

표현식 템플릿의 피연산자 대부분의 임시 노드들은 최상위 표현식과 관련이 있기 때문에 전체 표현식을 모두 계산할 때 까지 계속 살아남아야 한다 A_Scalar 노드는 예외다 이들은 연산자 함수에 연결되며 전체 표현식의 계산이 종료 전에 사라진다 스칼라 피연산자는 값으로 복사돼야만 한다. typename A_Traits<OP1>::ExprRef op1; typename A_Traits<OP2>::ExprRef op2;

표현식 템플릿의 피연산자 template <typename T> class A_Traits { public: typedef T const& ExprRef; }; class A_Traits<A_Scalar<T> > public: typedef A_Scalar<T> ExprRef;

진행 순서 단순 배열 클래스 구현하여 배열 연산 문제 제기 표현식 템플릿 구현 표현식 템플릿을 아는 랩퍼클래스와 연산자 구현 실재 표현식 템플릿 사용해서 동작 방법 추적

Array형 실제 저장소를 제어하고 표현식 템플릿에 대해 아는 Array형 및 연산자 만들기 쉽게 얘기해서 "레퍼클래스" 만들어 보자

점점 귀찮아진다~!

Array형 template <typename T, typename Rep = SArray<T> > class Array { private: Rep expr_rep; public: //생성자 explicit Array (size_t s) : expr_rep(s) { } //복사 생성자 Array (Rep const& rb) : expr_rep(rb) { }

Array형 //할당연산자 Array& operator= (Array const& b) { assert(size()==b.size()); for (size_t idx = 0; idx<b.size(); ++idx) expr_rep[idx] = b[idx]; } return *this;

Array형 template<typename T2, typename Rep2> Array& operator= (Array<T2, Rep2> const& b) { assert(size()==b.size()); for (size_t idx = 0; idx<b.size(); ++idx) expr_rep[idx] = b[idx]; } return *this; } //다른 타입에 대한 할당 연산자

Array형 //크기 반환 size_t size() const { return expr_rep.size(); }

Array형 T operator[] (size_t idx) const { assert(idx<size()); return expr_rep[idx]; } T& operator[] (size_t idx)

Array형 Rep const& rep() const { return expr_rep; } Rep& rep() };

점점 깊이 들어간다…

코드가 참 어렵습니다 class A { public: A(B const& b) {} }; class B { public: B(C const& c, D const& d) {} A f(C const& c, D const& d) { return A(B(c,d)); }

덧셈 연산자 template <typename T, typename R1, typename R2> Array<T, A_Add<T,R1,R2> > operator+ (Array<T,R1> const& a, Array<T,R2> const& b) { return Array<T, A_Add<T,R1,R2> > (A_Add<T,R1,R2>(a.rep(),b.rep())); }

생성자 코드 Array<T, > ( ); A_Add<T,R1,R2> ( ); A_Add<T,R1,R2> A_Add<T,R1,R2>( ) a.rep(),b.rep()

operator+ Array Array SArray SArray Array Array A_Add A_Scalar SArray

곱셈 연산자 template <typename T, typename R1, typename R2> Array<T, A_Mult<T,R1,R2> > operator* (Array<T,R1> const& a, Array<T,R2> const& b) { return Array<T, A_Mult<T,R1,R2> > (A_Mult<T,R1,R2>(a.rep(), b.rep())); }

operator* Array Array SArray SArray Array Array A_Mult A_Scalar SArray

스칼라 곱셈 연산자 template <typename T, typename R2> Array<T, A_Mult<T,A_Scalar<T>,R2> > operator* (T const& s, Array<T,R2> const& b) { return Array<T,A_Mult<T,A_Scalar<T>,R2> > (A_Mult<T,A_Scalar<T>,R2>(A_Scalar<T>(s), b.rep())); }

operator* Array SArray double Array Array A_Mult A_Scalar double

점점 안드로메다로~!

진행 순서 단순 배열 클래스 구현하여 배열 연산 문제 제기 표현식 템플릿 구현 표현식 템플릿을 아는 랩퍼클래스와 연산자 구현 실재 표현식 템플릿 사용해서 동작 방법 추적

연산을 추적 해보자 int main() { Array<double> x(1000), y(1000); //... x = 1.2*x + x*y; }

연산을 추적 해보자 1.2*x (double, Array<double, Sarray<double> >) template <typename T, typename R2> Array<T, A_Mult<T,A_Scalar<T>,R2> > operator* (T const& s, Array<T,R2> const& b) { return Array<T,A_Mult<T,A_Scalar<T>,R2> > (A_Mult<T,A_Scalar<T>,R2>(A_Scalar<T>(s), b.rep())); }

operator* Array SArray double Array Array A_Mult A_Scalar double

연산을 추적 해보자 x*y (Array<double, Sarray<double> >) template <typename T, typename R1, typename R2> Array<T, A_Mult<T,R1,R2> > operator* (Array<T,R1> const& a, Array<T,R2> const& b) { return Array<T, A_Mult<T,R1,R2> > (A_Mult<T,R1,R2>(a.rep(), b.rep())); }

operator* Array Array SArray SArray Array Array A_Mult A_Scalar SArray

연산을 추적 해보자 1.2*x + x*y template <typename T, typename R1, typename R2> Array<T, A_Add<T,R1,R2> > operator+ (Array<T,R1> const& a, Array<T,R2> const& b) { return Array<T, A_Add<T,R1,R2> > (A_Add<T,R1,R2>(a.rep(),b.rep())); }

operator+ Array A_Mult A_Scalar double SArray Array A_Mult A_Scalar A_Add A_Mult A_Scalar double SArray Array A_Add A_Mult A_Scalar double SArray A_Mult A_Scalar SArray

연산을 추적 해보자 template<typename T2, typename Rep2> Array& operator= (Array<T2, Rep2> const& b) { assert(size()==b.size()); for (size_t idx = 0; idx<b.size(); ++idx) expr_rep[idx] = b[idx]; } return *this;

template <typename T, typename Rep = SArray<T> > class Array { T& operator[] (size_t idx) { assert(idx<size()); return expr_rep[idx]; } }; Array A_Add A_Mult A_Scalar double SArray

연산을 추적 해보자 template <typename T, typename OP1, typename OP2> class A_Add { public: //할당 연산자 T operator[] (size_t idx) const { return op1[idx] + op2[idx]; } }; A_Add A_Mult A_Scalar double SArray

연산을 추적 해보자 template <typename T, typename OP1, typename OP2> class A_Mult { public: //할당 연산자 T operator[] (size_t idx) const { return op1[idx] * op2[idx]; } }; A_Mult A_Scalar double SArray

연산을 추적 해보자 //실질적인 연산과정 for (size_t idx = 0; idx<b.size(); ++idx) { x[idx]= (1.2*x[idx]) + (x[idx]*y[idx]); }

좋아 복잡했지만 그래도 끝냈다

잠깐만요 아직 끝나지 않았습니다!!

표현식 템플릿 할당 Array 클래스는 랩퍼 클래스로 배열연산이 가능했습니다 그런데 다시 한번 살펴 볼까요???

표현식 템플릿 할당 다시 말해 A + B = C 라는 코드가 가능하나요? 이 녀석은 할당이 가능합니다 Array SArray 이 녀석은 할당이 가능합니다 Array A_Add or A_Mult A_Scalar SArray 이 녀석은 할당이 가능하나요? 다시 말해 A + B = C 라는 코드가 가능하나요?

표현식 템플릿 할당 결과로의 할당이 가능한 다른 표현식 템플릿을 만들자 예를 들어 정수값의 배열을 인덱스로 사용하는 것은 하위 집합의 선택

표현식 템플릿 할당 x[y] = 2*x[y]; 이거도 해보고 싶어요 그러니깐 for ( int idx = 0; idx < x.size(); ++idx ) { x[ y[idx] ] = 2*x[ y[idx] ]; }

표현식 템플릿 할당 template<typename T, typename A1, typename A2> class A_Subscript { public: A_Subscript (A1 const& a, A2 const& b) : a1(a), a2(b) { }

표현식 템플릿 할당 T operator[] (size_t idx) const { return a1[a2[idx]]; } T& operator[] (size_t idx)

표현식 템플릿 할당 size_t size() const { return a2.size(); } private: A1 const& a1; A2 const& a2; };

표현식 템플릿 할당 template < typename T2, typename R2> inline Array<T, A_Subscript<T, R, R2> > Array<T, R>::operator[](Array<T2, R2> const& b) { return Array<T, A_Subscript<T, R, R2> > (A_Subscript<T, R, R2>(*this, b)); }

표현식 템플릿의 성능과 한계 표현식 템플릿이라는 아이디어는 상당히 복잡하지만 배열 연산의 성능을 굉장히 향상 시킨다 서로를 호출하는 작은 인라인 함수가 많고 표현식 템플릿은 호출 스택에 할당됐다 인라인 처리와 작은 객체 제거가 관건

표현식 템플릿의 성능과 한계 모든 문제 상황을 해결하진 않음 행렬 벡터 곱셈 x = A*x x는 크기 n, A는 크기 n*n 달라지기 때문에 임시변수가 필요하다

표현식 템플릿의 성능과 한계 표현식 템플릿의 데이터형에 트리를 표현하는것이 아니라 표현식 트리를 나타내는 실행 시간 구조를 생성해야만 하는 것이다 람다라이브러리 http://www.boost.org/doc/libs/1_49_0/doc/html/lambda.html

감사합니다 페이지가 97페이지…