본문 바로가기
programing/C++

[Modern C++] 람다 함수 & decltype

by RedWiz 2016. 8. 16.

- 함수 포인터를 호출하면 함수로 점핑(Jumping)이 일어남


- 점핑하면서 오버헤드가 생기는데 이 오버헤드를 막기위해 인라인 함수가 존재


- 인라인화 하게 되면 매크로화 되어서 컴파일시에 함수가 호출되는 부분에 완전한 함수체를 삽입함


- C++에서는 함수 객체로 인라인 함수 사용 가능 ()


- C++11에서는 함수 객체보다 더 간결한 람다로 인라인 함수 사용 가능


- 람다 : 익명함수 (Anonymous Function)

└ 형태 : [ 캡쳐 ] ( 인수 ) -> 반환타입 { 식 }

└ 캡쳐 : 외부 인자, = : 복사 , & : 참조, 특정 변수만 설정도 가능

└ 인수 : 디폴트 설정 불가, 가변 크기 불가

└ 반환 타입 : 보통은 식에서 return값을 추측하지만 추측과 다를경우 오류가 생기므로 설정

└ 인수, 반환타입을 설정안하면 (), -> 생략 가능

└ 캡쳐된 복사 변수는 const 타입 이므로 mutable 키워드를 붙여주면 외부 변수 수정이 가능 

└ mutable 키워드는 사용하려면 ()을 붙여줘야 함

└ ex)

int x = 0;

[=]() mutable
{
    x++;
};


- decltype 키워드

└ 컴파일러가 표현식의 데이터 형을 찾아냄

└ ex) decltype(13123); // int

└ ex) decltype(123 + 1.2); // double

└ ex) decltype(string("안녕")); // string

└ auto와 용도가 비슷하나 주로 반환 타입을 결정할 때 사용(

└ auto 만으로 반환 타입이 결정되지 않음

└ ex)

// C++ 11에서는 auto함수에서 반환 타입이 반드시 필요함


auto add(int a, int b) -> decltype(a+b)
{
    return a + b;
};



cf. C++ 14에서는 반환 값을 auto지정에 의한 자료형 추론이 가능

└ 그렇다고 한 함수에 여러 타입을 반환하면 안됨


auto add(int a, int b)
{
    return a + b;
};



cf. 왜 inline 함수는 함수 객체만 가능하고 함수 포인터는 불가능한가?

- C++ 정책이 그래서 그렇다

- 컴파일러가 함수 포인터에서 어떤 함수를 호출할 지 모른다.

- inline 함수는 매크로 함수처럼 컴파일 타임에 치환을 하여 함수 코드가 직접 함수 호출 위치에 들어감

- 함수 포인터는 포인터인 관계로 컴파일 타임이 아니고 런타임에서 호출이 결정됨

=> 무엇이 호출될 지가 런타임에서 밖에 모르는데 코드는 런타임 시점에서 이미 다 만들어진 상태


cf. inline 함수의 단점

- 매크로 함수와 같음 : 코드의 비대화 -> 코드 영역이 늘어남 -> 실행 파일 크기가 커짐

└ 매크로 함수와 다른점은 매크로 함수의 중복 수행 문제를 막음

- 자주 사용하는 짧은 inline함수는 캐싱되지 못함 -> 일반 함수에 비해 캐시 히트를 노릴 수 없음



cf. 모던 C++의 새로운 함수 정의 문법 (alternative fuction syntax)


auto function(int i) -> int

{

return 0;

}



'programing > C++' 카테고리의 다른 글

[Modern C++] 유니폼 초기화(vector)  (0) 2016.08.16
[Modern C++] range-based for (범위 기반 for문)  (0) 2016.08.16
erase()와 remove() 차이  (1) 2016.08.04
임시객체  (0) 2016.08.02
INI 파일 함수  (0) 2015.06.09