SlideShare a Scribd company logo
Effective Modern C++ Study
C++ Korea
발표자 : 윤석준
[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준
[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준
Effective Modern C++ Study
C++ Korea
try
{
if (/* Exception Condition */)
throw new std::exception("Error Description");
}
catch (std::exception e)
{
cout << "Exception : " << e.what() << endl;
}
4
예외가 발생할 수 있는 부분을 정의
try { } 와 catch { } 는 한쌍
예외를 발생시킴
try 안에서 발생한 예외 중 e를 catch
예외 처리
Effective Modern C++ Study
C++ Korea5
• void func(int a)
• void func(int a) throw(int);
• void func(int a) throw(char *, int);
• void func(int a) throw();
모든 타입의 예외가 발생 가능하다.
int 타입 예외를 던질 수 있다.
타입이 2가지 이상일 경우는 , 로 나열
예외를 발생하지 않는다.
Effective Modern C++ Study
C++ Korea6
void f1() { throw 0; }
void f2() { f1(); }
void f3() { f2(); }
void f4() { f3(); }
void main()
{
try
{
f4();
}
catch (int e)
{
std::cout << e << std::endl;
}
}
 예외 처리를 하기 위해 발생 시점부터 처리하는 위치까지 Stack에서 함수를 소멸시키면서 이동
함수 호출
스택 풀기
http://devluna.blogspot.kr/2015/02/c-exception-handling.html
[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준
Effective Modern C++ Study
C++ Korea8
 사용자는 자신이 사용 하는 함수의 발생 가능한 예외들에 대해서 알고 있어야 한다.
 하지만 C++에서는 상당히 귀찮은 일이고 그 동안 잘 안 했었다.
 기껏해야 예외를 발생하지 않을 경우만 명시적으로 선언해주는 친절한 사람도
간혹 있긴 하더라고 누군가 말하는걸 얼핏 들은 적이라도 있나 ?
(난 없음)
int f(int x) throw(); // C++98 Style
int f(int x) noexcept; // C++11 Style
Effective Modern C++ Study
C++ Korea9
• C++98 Style : 스택 풀기(Stack unwinding)을 시도
• C++11 Style : 스택 풀기를 프로그램 종료전에 할 수도 있다.
(gcc는 하지않고 종료, Clang은 종료전에 스택 풀기 수행)
• noexcept를 쓰면 예외가 전파되는 동안 Runtime 스택을 유지할 필요도 없고,
함수내 생성한 객체도 순서에 상관없이 소멸이 가능하다.
int f(int x) noexcept; // most optimizable
int f(int x) throw(); // less optimizable
int f(int x); // less optimizable
Effective Modern C++ Study
C++ Korea10
• Push를 하려는데 내부 버퍼가 꽉찼다면 ?
1. 크기를 2배로 확장
2. Data COPY
3. 기존 공간 삭제
4. 객체가 가리키는 주소 변경
std::vector<Widget> vw;
Widget w;
vw.push_back(w);
• 어~~~~ 그런데~~~~~
COPY 중 오류가 나면 ???
1. 그냥 기존꺼 쓰면 되지머.
2. 끝 !
Effective Modern C++ Study
C++ Korea11
• Push를 하려는데 내부 버퍼가 꽉찼다면 ?
1. 크기를 2배로 확장
2. Data MOVE
3. 기존 공간 삭제
4. 객체가 가리키는 주소 변경
• 어~~~~ 그런데~~~~~
MOVE 중 오류가 나면 ???
1. 다시 원래대로 MOVE 하자.
• 어~ 다시 MOVE 하는데 오류가 ?
아놔~
std::vector<Widget> vw;
Widget w;
vw.push_back(w);
Effective Modern C++ Study
C++ Korea12
• 그럼 MOVE 하지 말고 C++ 98 Style로 COPY를 ?
• 예외가 안 일어난다고 확인된 것만 MOVE 하자.
• 예외가 일어날지 안 일어날지는 어떻게 알고 ?
• noexcept 라고 선언된 것만 MOVE 하자.
Effective Modern C++ Study
C++ Korea13
noexcept(bool expr = true)
template <class T, size_t N>
void swap(T(&a)[N],
T(&b)[N]) noexcept(noexcept(swap(*a, *b)));
template <class T1, class T2>
struct pair {
...
void swap(pair& p) noexcept(noexcept(swap(first, p.first)) &&
noexcept(swap(second, p.second)));
...
};
배열의 각 요소들의 swap이
noexcept인 경우 해당 함수도
noexcept
pair의 각 요소들의 swap이
noexcept인 경우 해당 함수도
noexcept
[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준
Effective Modern C++ Study
C++ Korea15
 noexcept는 심사 숙고해서 사용하자.
noexcept로 선언한 함수를 수정하였는데 예외가 발생할 수 있게 되었다면 ???
noexcept지우면 되지머.
그럼 noexcept라고 믿고 해당 함수를 쓴 code들은 ???
흠… 난리나겠네. ;;;;
예외가 안나오도록 안에서 어떻게든 다 처리하지머.
noexcept를 쓰는 이유가 성능상 이익을 보기 위해서인데… 이러면…
아고… 의미없다.
그럼 예외가 아니라 return값으로 error code들을 처리하면 ???
성능상 이익이라고 아까 말했는데, 이러면 함수를 사용한 쪽에서 다시 해석을 해야하고…
Effective Modern C++ Study
C++ Korea16
• default로 noexcept 의 특성을 가지는 대표적인 예
• 멤버 변수의 소멸자가 모두 noexcept일 경우 자동으로 noexcept로 처리
(STL내에는 예외 발생 가능한 소멸자는 없다.)
• 예외가 발생할 수 있을 경우는 명시적으로 noexcept(false)로 선언
Effective Modern C++ Study
C++ Korea17
• Wide contracts : 함수 호출 전 사전 조건이 없음
void f(const std::string& s) noexcept; // precontidion : s.length() <= 32
• Narrow contracts : 함수 호출 전 사전 조건이 있음
Precondition violation exception 을 발생시켜야 한다.
Effective Modern C++ Study
C++ Korea18
void setup();
void cleanup();
void init() noexcept
{
setup();
// do something
cleanup();
}• C-Style 함수
• C++98 이전에 개발된 함수
일수도 있으므로, noexcept 여부를 Check하지 않는다.
noexcept 선언이 없는데…
[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준
Effective Modern C++ Study
C++ Korea20
• noexcept는 함수 인터페이스에 속한다. 해당 함수 사용자는 noexcept 여부에 대해서 알아야 한다.
• noexcept로 함수를 선언하면 성능상의 이점을 볼 수 있다.
• move 연산, swap, 메모리 해제 함수, 소멸자 등에서의 noexcept 여부는 아주 중요하다.
• 대부분의 함수들은 noexcept로 선언하지 않고 예외를 처리하는 함수로 선언하는게 더 자연스럽다.
http://devluna.blogspot.kr/2015/02/item-14-noexcept.html
icysword77@gmail.com

More Related Content

PDF
[C++ korea] effective modern c++ study item 17 19 신촌 study
PDF
[C++ Korea] Effective Modern C++ Study item 24-26
PDF
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
PDF
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
PDF
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
PPTX
Clean code slide
PDF
Effective Modern C++ 勉強会#1 Item3,4
PDF
Proxies are Awesome!
[C++ korea] effective modern c++ study item 17 19 신촌 study
[C++ Korea] Effective Modern C++ Study item 24-26
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study, Item 27, 29 - 30
[C++ Korea] Effective Modern C++ Study, Item 11 - 13
Clean code slide
Effective Modern C++ 勉強会#1 Item3,4
Proxies are Awesome!

What's hot (15)

PDF
Introduction to D programming language at Weka.IO
PPTX
Effective Modern C++勉強会#4 Item 17, 18資料
KEY
Clean code and Code Smells
PPTX
Clean code
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
PPTX
Effective modern c++ 8
PDF
PPTX
Visual C++で使えるC++11
PDF
The Art Of Readable Code
PPTX
Clean code
PDF
Smart Pointers in C++
PDF
C++ ポインタ ブートキャンプ
PDF
Clean coding-practices
PDF
Keep your code clean
PDF
Java cours n° 2 - classe-objet-constructeur
Introduction to D programming language at Weka.IO
Effective Modern C++勉強会#4 Item 17, 18資料
Clean code and Code Smells
Clean code
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Effective modern c++ 8
Visual C++で使えるC++11
The Art Of Readable Code
Clean code
Smart Pointers in C++
C++ ポインタ ブートキャンプ
Clean coding-practices
Keep your code clean
Java cours n° 2 - classe-objet-constructeur
Ad

Viewers also liked (10)

PDF
[C++ korea] effective modern c++ study item 3 understand decltype +이동우
PDF
[C++ korea] effective modern c++ study item 4 - 6 신촌
DOCX
기업을 위한 Google drive 100% 활용 백서
PDF
[C++ korea] effective modern c++ study item 7 distinguish between () and {} w...
PDF
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
PDF
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
PPTX
[C++ korea] effective modern c++ study item8~10 정은식
PPTX
Effective C++ Chaper 1
PPTX
[1116 박민근] c++11에 추가된 새로운 기능들
PDF
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[C++ korea] effective modern c++ study item 3 understand decltype +이동우
[C++ korea] effective modern c++ study item 4 - 6 신촌
기업을 위한 Google drive 100% 활용 백서
[C++ korea] effective modern c++ study item 7 distinguish between () and {} w...
[C++ Korea] Effective Modern C++ MVA item 8 Prefer nullptr to 0 and null +윤석준
[C++ Korea] Effective Modern C++ MVA item 9 Prefer alias declarations to type...
[C++ korea] effective modern c++ study item8~10 정은식
Effective C++ Chaper 1
[1116 박민근] c++11에 추가된 새로운 기능들
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
Ad

Similar to [C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준 (20)

PDF
Effective modern cpp item14
PDF
[C++ Korea 2nd Seminar] C++17 Key Features Summary
PDF
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
PDF
Effective c++ chapter1 2_dcshin
PDF
HI-ARC PS 101
PDF
C++20 Key Features Summary
PPTX
불어오는 변화의 바람, From c++98 to c++11, 14
PDF
Exception&log
PPTX
Changes in c++0x
PPTX
모던 C++ 정리
PDF
Effective c++ chapter 1,2 요약
PDF
C++17 Key Features Summary - Ver 2
PDF
2013 C++ Study For Students #1
PPT
카사 공개세미나1회 W.E.L.C.
PPTX
About Visual C++ 10
PPTX
Modern C++의 타입 추론과 람다, 컨셉
PDF
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
PPTX
Let's Go (golang)
PDF
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
PDF
C Language For Arduino
Effective modern cpp item14
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
Effective c++ chapter1 2_dcshin
HI-ARC PS 101
C++20 Key Features Summary
불어오는 변화의 바람, From c++98 to c++11, 14
Exception&log
Changes in c++0x
모던 C++ 정리
Effective c++ chapter 1,2 요약
C++17 Key Features Summary - Ver 2
2013 C++ Study For Students #1
카사 공개세미나1회 W.E.L.C.
About Visual C++ 10
Modern C++의 타입 추론과 람다, 컨셉
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
Let's Go (golang)
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
C Language For Arduino

More from Seok-joon Yun (20)

PDF
Retrospective.2020 03
PDF
Sprint & Jira
PPTX
Eks.introduce.v2
PDF
Eks.introduce
PDF
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
PDF
아파트 시세,어쩌다 머신러닝까지
PPTX
Pro typescript.ch07.Exception, Memory, Performance
PPTX
Doing math with python.ch07
PPTX
Doing math with python.ch06
PPTX
Doing math with python.ch05
PPTX
Doing math with python.ch04
PPTX
Doing math with python.ch03
PPTX
Doing mathwithpython.ch02
PPTX
Doing math with python.ch01
PPTX
Pro typescript.ch03.Object Orientation in TypeScript
PDF
C++ Concurrency in Action 9-2 Interrupting threads
PDF
Welcome to Modern C++
PDF
[2015-07-20-윤석준] Oracle 성능 관리 2
PDF
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
PDF
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
Retrospective.2020 03
Sprint & Jira
Eks.introduce.v2
Eks.introduce
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
아파트 시세,어쩌다 머신러닝까지
Pro typescript.ch07.Exception, Memory, Performance
Doing math with python.ch07
Doing math with python.ch06
Doing math with python.ch05
Doing math with python.ch04
Doing math with python.ch03
Doing mathwithpython.ch02
Doing math with python.ch01
Pro typescript.ch03.Object Orientation in TypeScript
C++ Concurrency in Action 9-2 Interrupting threads
Welcome to Modern C++
[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4

[C++ korea] effective modern c++ study item 14 declare functions noexcept if they won't emit exceptions +윤석준

  • 1. Effective Modern C++ Study C++ Korea 발표자 : 윤석준
  • 4. Effective Modern C++ Study C++ Korea try { if (/* Exception Condition */) throw new std::exception("Error Description"); } catch (std::exception e) { cout << "Exception : " << e.what() << endl; } 4 예외가 발생할 수 있는 부분을 정의 try { } 와 catch { } 는 한쌍 예외를 발생시킴 try 안에서 발생한 예외 중 e를 catch 예외 처리
  • 5. Effective Modern C++ Study C++ Korea5 • void func(int a) • void func(int a) throw(int); • void func(int a) throw(char *, int); • void func(int a) throw(); 모든 타입의 예외가 발생 가능하다. int 타입 예외를 던질 수 있다. 타입이 2가지 이상일 경우는 , 로 나열 예외를 발생하지 않는다.
  • 6. Effective Modern C++ Study C++ Korea6 void f1() { throw 0; } void f2() { f1(); } void f3() { f2(); } void f4() { f3(); } void main() { try { f4(); } catch (int e) { std::cout << e << std::endl; } }  예외 처리를 하기 위해 발생 시점부터 처리하는 위치까지 Stack에서 함수를 소멸시키면서 이동 함수 호출 스택 풀기 http://devluna.blogspot.kr/2015/02/c-exception-handling.html
  • 8. Effective Modern C++ Study C++ Korea8  사용자는 자신이 사용 하는 함수의 발생 가능한 예외들에 대해서 알고 있어야 한다.  하지만 C++에서는 상당히 귀찮은 일이고 그 동안 잘 안 했었다.  기껏해야 예외를 발생하지 않을 경우만 명시적으로 선언해주는 친절한 사람도 간혹 있긴 하더라고 누군가 말하는걸 얼핏 들은 적이라도 있나 ? (난 없음) int f(int x) throw(); // C++98 Style int f(int x) noexcept; // C++11 Style
  • 9. Effective Modern C++ Study C++ Korea9 • C++98 Style : 스택 풀기(Stack unwinding)을 시도 • C++11 Style : 스택 풀기를 프로그램 종료전에 할 수도 있다. (gcc는 하지않고 종료, Clang은 종료전에 스택 풀기 수행) • noexcept를 쓰면 예외가 전파되는 동안 Runtime 스택을 유지할 필요도 없고, 함수내 생성한 객체도 순서에 상관없이 소멸이 가능하다. int f(int x) noexcept; // most optimizable int f(int x) throw(); // less optimizable int f(int x); // less optimizable
  • 10. Effective Modern C++ Study C++ Korea10 • Push를 하려는데 내부 버퍼가 꽉찼다면 ? 1. 크기를 2배로 확장 2. Data COPY 3. 기존 공간 삭제 4. 객체가 가리키는 주소 변경 std::vector<Widget> vw; Widget w; vw.push_back(w); • 어~~~~ 그런데~~~~~ COPY 중 오류가 나면 ??? 1. 그냥 기존꺼 쓰면 되지머. 2. 끝 !
  • 11. Effective Modern C++ Study C++ Korea11 • Push를 하려는데 내부 버퍼가 꽉찼다면 ? 1. 크기를 2배로 확장 2. Data MOVE 3. 기존 공간 삭제 4. 객체가 가리키는 주소 변경 • 어~~~~ 그런데~~~~~ MOVE 중 오류가 나면 ??? 1. 다시 원래대로 MOVE 하자. • 어~ 다시 MOVE 하는데 오류가 ? 아놔~ std::vector<Widget> vw; Widget w; vw.push_back(w);
  • 12. Effective Modern C++ Study C++ Korea12 • 그럼 MOVE 하지 말고 C++ 98 Style로 COPY를 ? • 예외가 안 일어난다고 확인된 것만 MOVE 하자. • 예외가 일어날지 안 일어날지는 어떻게 알고 ? • noexcept 라고 선언된 것만 MOVE 하자.
  • 13. Effective Modern C++ Study C++ Korea13 noexcept(bool expr = true) template <class T, size_t N> void swap(T(&a)[N], T(&b)[N]) noexcept(noexcept(swap(*a, *b))); template <class T1, class T2> struct pair { ... void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && noexcept(swap(second, p.second))); ... }; 배열의 각 요소들의 swap이 noexcept인 경우 해당 함수도 noexcept pair의 각 요소들의 swap이 noexcept인 경우 해당 함수도 noexcept
  • 15. Effective Modern C++ Study C++ Korea15  noexcept는 심사 숙고해서 사용하자. noexcept로 선언한 함수를 수정하였는데 예외가 발생할 수 있게 되었다면 ??? noexcept지우면 되지머. 그럼 noexcept라고 믿고 해당 함수를 쓴 code들은 ??? 흠… 난리나겠네. ;;;; 예외가 안나오도록 안에서 어떻게든 다 처리하지머. noexcept를 쓰는 이유가 성능상 이익을 보기 위해서인데… 이러면… 아고… 의미없다. 그럼 예외가 아니라 return값으로 error code들을 처리하면 ??? 성능상 이익이라고 아까 말했는데, 이러면 함수를 사용한 쪽에서 다시 해석을 해야하고…
  • 16. Effective Modern C++ Study C++ Korea16 • default로 noexcept 의 특성을 가지는 대표적인 예 • 멤버 변수의 소멸자가 모두 noexcept일 경우 자동으로 noexcept로 처리 (STL내에는 예외 발생 가능한 소멸자는 없다.) • 예외가 발생할 수 있을 경우는 명시적으로 noexcept(false)로 선언
  • 17. Effective Modern C++ Study C++ Korea17 • Wide contracts : 함수 호출 전 사전 조건이 없음 void f(const std::string& s) noexcept; // precontidion : s.length() <= 32 • Narrow contracts : 함수 호출 전 사전 조건이 있음 Precondition violation exception 을 발생시켜야 한다.
  • 18. Effective Modern C++ Study C++ Korea18 void setup(); void cleanup(); void init() noexcept { setup(); // do something cleanup(); }• C-Style 함수 • C++98 이전에 개발된 함수 일수도 있으므로, noexcept 여부를 Check하지 않는다. noexcept 선언이 없는데…
  • 20. Effective Modern C++ Study C++ Korea20 • noexcept는 함수 인터페이스에 속한다. 해당 함수 사용자는 noexcept 여부에 대해서 알아야 한다. • noexcept로 함수를 선언하면 성능상의 이점을 볼 수 있다. • move 연산, swap, 메모리 해제 함수, 소멸자 등에서의 noexcept 여부는 아주 중요하다. • 대부분의 함수들은 noexcept로 선언하지 않고 예외를 처리하는 함수로 선언하는게 더 자연스럽다.