본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 8. C++ auto, decltype

by 신림83 2020. 10. 12.
반응형

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 둘다 컴파일 타임 기능들입니다. 실제 실행타입 오버해드는 없습니다.

반응형

댓글