CPP 초급 강좌 8. C++ auto, decltype
auto?
c++11 이후로 사용 시, 데이터 타입 추론기능을 가진 키워드, 초기화 값에 따라 알아서 데이터 타입을 정해주는 키워드
예제를 봅시다.
int a[7] = { 1,2,3,4,5,6,7 };
int b = a[0];
이런 코드를 가 있습니다. 만약 a의 타입을 float로 바꾼다고 하면 b역시 float로 바꾸어야겠죠. 아래와 같이 수정할 필요가 있을 것입니다.
float a[7] = { 1,2,3,4,5,6,7 };
float b = a[0];
그런데 a의 형식이 자주 바뀐다면, b 형식 또한 그 수만큼 바꿔줘야 하는데, 이럴때 auto를 사용하면 좋습니다.
auto 사용
double a[7] = { 1,2,3,4,5,6,7 };
auto b = a[0];
b와 같은 경우는 컴파일 타임에 auto를 사용한 결과 double로 자동결정됩니다.
declype?
c++11 추가된 키워드로, 값에 맞는 타입을 추출함
double a[7] = { 1,2,3,4,5,6,7 };
auto b = a[0];
decltype(a) c;
*auto, decltype 모두 변수의 타입이 컴파일 타입에 결정되므로, 실행 시간에 오버해드가 없습니다. 가끔 오해하시는 분이 있습니다. 어셈브러 코드를 보면 이미 변환된 변수가 박혀있습니다.
auto 는 우변의 수식으로 좌변을 결정합니다. auto b = a[0]; 에서 반드시 우변(a[0)이 필요합니다.
decltype 는 ()의 표현식을 가지고 타입을 결정합니다. decltype(a) c; 에서 (a) 입니다. 우변 초기값은 필요가 없습니다.
배열의 경우는?
int a[7] = { 1,2,3,4,5,6,7 };
auto a1 = a;
decltype(a) a2;
auto a3 = a[0];
decltype(a[0]) a4;
a1 의 경우는 int* a1 = a; 코드로 치환됩니다. a1의 타입은 int* 입니다.
a2 의 경우는 int a2[7]; 코드로 치환됩니다.
a3 은 int 입니다.
a4 는 int& 입니다.
함수의 경우는?
타입형태를 직접 출력해보는 함수를 사용해서 보도록 합시다.
#include <iostream>
#include <typeinfo>
using namespace std;
int f(int i)
{
return 0;
}
int main()
{
f(0);
decltype(f) d1;
decltype(&f) d2;
decltype(f(0)) d3;
cout << typeid(d1).name() << endl;
cout << typeid(d2).name() << endl;
cout << typeid(d3).name() << endl;
}
d1 은 함수타입입니다. int(int)
d2 는 함수 포인터 타입닙니다. int(*)(int)
d3 은 함수 반환 타입닙니다. int
d3 같은 경우는 함수가 호출된 결과값을 이용하거나 하는 것이 아닙니다. 그냥 반환 타입만 조사하는 것입니다.
auto, decltype 둘다 컴파일 타임 기능들입니다. 실제 실행타입 오버해드는 없습니다.
'IT > C++(CPP)' 카테고리의 다른 글
CPP 초급 강좌 10. C++ string (1) | 2020.10.15 |
---|---|
CPP 초급 강좌 9. C++ constexpr, const (4) | 2020.10.14 |
CPP 초급 강좌 7. C++ 일관된 초기화(uniform initialization) (6) | 2020.10.08 |
CPP 초급 강좌 6. C++ 변수의 특징 (2) | 2020.10.07 |
CPP 초급 강좌 5. C++ Manipulator, Iomanipulator, 조정자 (0) | 2020.10.05 |
댓글