- 함수 포인터를 호출하면 함수로 점핑(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 |