3. Introduction
우리는 얼마나 C/C++를 정확히 이해하고 있는가?
2019-07-04
3
Q. 사용자로부터 배열의 크기를 입력 받아 배열을 선언하고자 한다. 다음 중 바르게 코딩한 것을 고르시오.
Data
Heap
Stack
4. Introduction
우리는 얼마나 C/C++를 정확히 이해하고 있는가?
2019-07-04
4
“가변 길이 배열(Variable-length array)”
: 배열의 크기를 컴파일 타임에 결정하지 않고, 런타임에 결정함.
VLA는 C99 표준이지만, VC는 이 표준을 따르지 않음.
(GCC, Clang 등 에서는 사용가능.)
오래 전 지식을 알고 있거나 한정된 컴파일러로 새롭게 추가된 feature를
적절히 활용하지 못하고 있음.
“기존에 잘 모르던 feature(STL) + 새롭게 추가된 feature (Modern C++)”
[이번 세미나의 방향성]
5. Introduction
History of C++
2019-07-04
5
C++11 C++14 C++17
C++98
The C++ Programming
Language 2nd edition
Bjarne Stroustrup
• C++ cast, bool
• Library : string, iostream,
complex
• STL(containers, algorithms,
iterators, function objects)
…
C++03
거기서 거기
• Minor revision
13년 후
<Modern C++>
* History of C++ (https://en.cppreference.com/w/cpp/language/history)
* Modern C++무조건 써야해? (https://tv.naver.com/v/4578722)
C++20/22
• Move semantic
• Unified initializations
• Auto and decltype
• Lambda functions
• Multithreading
• Regular expressions
• Smart pointers
• Hash tables
• std::array
…
7. Modern C++
Data type and Literal
2019-07-04
7
C++ 11
이름 의미
char 하나의 문자나 매우 좁은 범위를 갖는 정수
short 덜 좁은 범위를 갖는 정수
int 보통 범위를 갖는 정수
long 넓은 범위를 갖는 정수
long long 아주 넓은 범위를 갖는 정수
unsigned 위에서 말한 모든 타입의 부호가 없는 버전
signed 위에서 말한 모든 타입의 부호가 있는 버전
float 단정밀도를 갖는 부동소수점
double 배정밀도를 갖는 부동소수점
long double 큰 범위를 갖는 부동소수점
bool 불 방식
C++ 11
• char은 정말 특이한 아키텍처를 제외하면 거의 항상 8비트
• 이외의 크기는 하드웨어와 컴파일러의 구현에 따라 상이함.
g++ vc++
8. Modern C++
Data type and Literal
2019-07-04
8
리터럴 타입
2 int
2u unsigned
2l long
2ul unsigned long
2.0 double
2.0f float
2.0l long double
042 8진수 (0으로 시작하는 정수)
0x42 16진수 (0x, 0X 접두사)
0b11111101 2진수 (0b, 0B 접두사)
1’231'425'235 가독성 향상 (아포스트로피 ' 활용)
C++ 14
C++ 14
user0520 : !리터럴 왜 써요?
codingbot : 좋으니까 쓰죠!
유용함
애매모호함
정확함
9. Modern C++
Data type and Literal
2019-07-04
9
리터럴 타입
2 int
2u unsigned
2l long
2ul unsigned long
2.0 double
2.0f float
2.0l long double
042 8진수 (0으로 시작하는 정수)
0x42 16진수 (0x, 0X 접두사)
0b11111101 2진수 (0b, 0B 접두사)
1’231'425'235 가독성 향상 (아포스트로피 ' 활용)
C++ 14
C++ 14
“Apostrophe를 사용하면 가독성이 좋아진다”
10. Modern C++
Range based for loop
2019-07-04
10
Q. 주어진 배열의 요소를 출력하는 코드를 작성하시오.
C++ 11
표준 컨테이너에서 더 많이 활용됨.
Old style New style
: 간결하며, 안전하다
11. Modern C++
rvalue reference
2019-07-04
11
lvalue와 rvalue의 구분
int a = 30;
Left value? Right value?
전통적으로 왼쪽에 놓이는 값, 오른쪽에 놓이는 값으로 구분함.
lvalue : 주소를 가질 수 있는 값
rvalue : 주소를 가질 수 없는 값
Reference는??
int& a = 30;
int& a = b;
int b = 50;
“우리가 일반적으로 알고 있는
reference는 lvalue! ”
Modern C++에서는 이러한 임시 값을 가질 수 있는
rvalue reference를 지원한다.
Cf. Modern C++에서의 value 구분
C++ 11
12. Modern C++
rvalue reference
2019-07-04
12
C++ 11
Q. 다음 중 올바른 표현식과 그렇지 않은 표현식을 구분하고, 이유를 설명하시오.
const 키워드는 rvalue(주소를 변경하지 못하는)를 의미.
C++11에서 rvalue reference가 추가 되기 전에 많이 사용하던 형식.
13. Modern C++
Move Semantics(이동 생성자)
2019-07-04
13
C++ 11
str3 = str1+str2
a b c d e f
str2
return
str1
a b c d e f
operator+
str3
str3
a b c d e f
복사 생성자를 이용해 return 받은 임시값을 str3로 복사
복사 생성자 X, 이동 생성자 O
* 모두의 코드 (https://modoocode.com/227)
14. Modern C++
Move Semantics(이동 생성자)
2019-07-04
14
C++ 11
str3 = str1+str2
* 모두의 코드 (https://modoocode.com/227)
즉, 생성 객체에서 임시 객체를 가리키게 한다.
reference의 개념을 이용하지만, 임시 객체는 rvalue!
이 때 사용하는 것이 rvalue reference
아까 const reference가 rvalue 받는다며 그거 쓰면 안됨?
ㅇㅇ 안됨.
15. Modern C++
Move Semantics(이동 생성자)
2019-07-04
15
C++ 11
str3 = str1+str2
다시 정리하면 핵심은 무분별한 deep copy를 방지.
Shallow copy를 활용하여, 효율을 높이고 nullptr로 초기
화하여 다시 접근이 불가능하도록 만듦.
16. Modern C++
Move Semantics (std::move)
2019-07-04
16
C++ 11
string str1 = “abc”;
string str2 = “def”;
str1, str2 서로 자리를 바꾸는 함수의 구현을 생각해본다.
* 모두의 코드 (https://modoocode.com/228)
a b c d e f
str1 str2 tmp 총 3번의 copy
tmp str2
a b c a b c
str1 tmp
copy
d e f d e f
str2 str1
copy
a b c a b c
copy
a b c d e f
str1 str2
address1 address2
a b c d e f
str1 str2
address1 address2
17. Modern C++
Move Semantics (std::move)
2019-07-04
17
C++ 11
str1, str2 서로 자리를 바꾸는 함수의 구현을 생각해본다.
* 모두의 코드 (https://modoocode.com/228)
a b c d e f
str1 str2
address1 address2
a b c d e f
str1 str2
address1 address2
std::move는 lvalue를 이동가능한 값으로 캐스팅해줌.
절대로 move를 시켜주는 것이 아님.
이동생성자
복사
복사
• Call by value
• Call by reference
• Call by move semantics
(http://blog.naver.com/jidon333/60211056131 )
18. Modern C++
Move Semantics (성능)
2019-07-04
18
C++ 11
* Modern C++무조건 써야해? (https://tv.naver.com/v/4578722)
19. Modern C++
Pointer (포인터)
2019-07-04
19
C++ 11
포인터 초기화에는 반드시 nullptr을 사용하라.
C++ 98
C++ 11
* Item 8 : 0과 NULL 보다 nullptr을 사용하자 (http://bit.ly/2KWj1mX)
“nullptr은 모호성을 줄인다.”
20. Modern C++
Smart Pointer (스마트 포인터)
2019-07-04
20
C++ 11
원시 포인터(raw pointer)의 사용을 줄여라 표준 컨테이너 or 스마트 포인터는 프로그램의 안전성을 제공함.
“표준 컨테이너 or 스마트 포인터를 사용하라”
1. unique_ptr : 유일한 소유권을 가진 포인터.
2. shared_ptr : 소유권을 공유하는 포인터. (refcount의 증감을 통해 해제함. 소유권을 가지면 증가, 잃으면 감소)
3. weak_ptr : shared_ptr과 유사하나 순환 참조를 막는 포인터.
cf. 기존에 auto_ptr이라고 있었지만, C++11 표준부터는 삭제됨.
* Modern C++무조건 써야해? (https://tv.naver.com/v/4578722), Chromium(http://chromium-cpp.appspot.com/)
(* 이미 다른 언어들(C#, Java,…)에서는 기본적으로 GC를 내장하고 있음.)
메모리를 잘못 관리했을 때의 문제점
1. memory leak, 2. dangling pointer
21. Modern C++
Smart Pointer (스마트 포인터) - unique_ptr
2019-07-04
21
C++ 11
유일한 소유권을 가진 포인터
* 모두의 코드 (https://modoocode.com/229)
data에 new Data() 로 생성된 객체의 소유권을 보유한다면,
delete data 만 가능하고, delete data2 는 불가능
복사 X,
소유권 이전 O
a는 f()함수가 사라짐과 동시에 소멸.
사용자가 굳이 delete를 해줄 필요가 없음.
* [C++11] unique_ptr (https://bunhere.tistory.com/407)
22. Modern C++
Smart Pointer (스마트 포인터) - unique_ptr, make_unique
2019-07-04
22
C++ 11
유일한 소유권을 가진 포인터
* 모두의 코드 (https://modoocode.com/229)
23. Modern C++
Lambda expression
2019-07-04
23
C++ 11
[captures](parameters) -> return type {body}
외부 변수들을 캡쳐. &이면 참조, =이면 복사
known known known
???
캡처x, 입력 x, 반환형x, 단순 출력하는 함수
[](){cout<<“hello”<<endl;};
캡처x, 입력 int, 반환형 int, 합 출력하는 함수
[](int a, int b)->int{return a+b;}; [](int a, int b)->int{return a+b;}(5, 4);
[](){cout<<“hello”<<endl;}();
24. Modern C++
Lambda expression
2019-07-04
24
C++ 11
캡처?? 변수 그냥 인자로 받으면 되는 거 아냐??
“C++의 파워풀한 라이브러리 사용을 위해”
(eg. for_each, fill, transform)
인자를 맞춰줘야 함.
for_each ( InIt first, InIt last, UniOp op);
eg. for_each
첫번째 반복자~마지막 반복자 까지 해당 함수 개체를 수행함.
* 모두의 코드 (https://modoocode.com/196)
Total elements : 64
26. Modern C++
Modern C++ 기능 활용하기
2019-07-04
26
Q. 앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다. 세 자리 수를 곱해 만들 수 있는 가
장 큰 대칭수는 얼마입니까?
= 91 × 99
* 문제 출처 : Project Euler
9009
100~999
A B
x = ?
100~999
27. Modern C++
Modern C++ 기능 활용하기
2019-07-04
27
Q. 앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다. 세 자리 수를 곱해 만들 수 있는 가
장 큰 대칭수는 얼마입니까?
= 91 × 99
* 문제 출처 : Project Euler
9009
100~999
A B
x = ?
100~999
C++11의 to_string() 이용
기존에는 itoa ()
28. Summary
요약
2019-07-04
28
C++11 이상의 버전을 Modern C++이라고 함.
Move semantics는 기존의 copy 보다 훨씬 뛰어난 성능을 보임.
Raw pointe의 사용을 지양하고, 표준 컨테이너(vector, array 등등)을 적극 활용할 것.
필요에 따라 smart_ptr(unique_ptr)을 활용할 것.
lambda는 기존의 Functor(Function Object)와 비슷하지만, 작성이 훨씬 유리함.
29. Summary
Future works
2019-07-04
29
GAN Research
Vanilla GAN
DCGAN
InfoGAN
LSGAN
SRGAN
Development tools & Language
Tips(Document & Programming)
PyTorch
C++ Coding Standard
Modern C++
Mathematical Theory
Linear algebra
Probability & Information theory
Other research
Level Processor
Ice Crack Propagation
Python applications
Python executable & UI
Style Transfer
cGAN
wGAN
BEGAN
BigGAN
Cycle GAN
Style GAN
3D reconstruction
DONE
TO
DO