(C++) 6장 인라인

1. 인라인 함수

함수 호출은 메모리상의 점프를 이용하며, 여러가지 상태 정보등을 저장하고 복원해야 하므로 내부적으로 복잡한 과정을 거친다. 그런 인라인 함수를 사용하면 복잡한 함수 호출 과정을 단순하게 대체 할 수 있다.

inline 반환형 함수명 (매개변수 목록);


#include<iostream>
using namespace std;

class Chulsoo
{
 public:
   void eat();
   inline void EatInline(int SteakWeight);

};

void Chulsoo::eat()
{
 cout<<"철수가 먹는다"<<endl;
}
inline void Chulsoo::Eatlne(int SteakWeight)
{

}
int main(void)
{
 Chulsoo chulsoo;
 chulsoo.eat();
 chulsoo.EatInline(5000);
return 0;
}


//하지만 이 인라인함수는 일반함수와 다르지 않으므로 두 차이점을 명확히 보여주겟다.

#include<iostream>
using namespace std;

class Chulsoo
{
 public:
  void Eat(int SteakWeight);
  inline void EatInline(int SteakWeight)
  {
    cout<<"EatInline():철수는"<<SteakWeight<<"g짜리를 먹는다"<<endl;

  }
}

int main(void)
{
 Chulsoo chulsoo;
 chulsoo.EatInline(5000);

}



-->>>>>>>인라인 함수는 선언하면 컴파일러가 해당함수의 코드 전체를 호출한 코드 위치로 복사하여 대체 한다.
따라서 함수 호출 단계가 줄어 복잡한 과정이 생략되므로 함수의 동작방식이 더 간단해지고 성능이 향상된다.
하지만 인라인 함수를 10번,100번 호출하게 되면 컴파일 이후 실행파일의 크기가 커진다.

함수의 정의부가 길지 않을 때는 인라인함수가 좋다. 특히, CPU,메모리 등의 성능이 중요한 임베디드 환경에서는 인라인 함수를 잘이용하면 성능에서 이득을 본다.


2. 람다함수
람다함수는 인라인 함수처럼 복잡한 함수 호출 과정을 생략해서 시간을 절약할 수 있을 뿐만 아니라 , 코드의 가독성까지 높여준다.

int main(void)
{
 [](int SteakWeight){cout<<"eatLambda()::철수는<<
                                SteakWeight<<"g짜리 스테이크를 먹는다."<<endl;}(1000);
}

람다함수란 인라인으로 정의와 호출을 한번에 하는 익명함수
   1              2            3           4             5          6
[캡처] (매개변수 목록) mutable 예외목록-> 반환형 {함수 몸체}


1. [=] : 모든 외부 변수를 값으로 전달받아서 캡처한다.
   [&] : 모든 외부 변수를 참조로 전달받아서 캡처한다.


chulsoo.count=1;
for(int i=0;i<10;i++){
[=](int steakWeight){cout<<"eatLambda()::철수는"<<chulsoo.count++<<"번째"<<steakWeigt<<"g짜리 스테이크를 먹는다"<<endl;}(1000);
}

/////////오류가 발생한다. 그이유는 [=]는 모든 변수를 값으로 전달받아서 캡처한다.
즉 람다함수 외부변수인 chulsoo.count값도 람다 함수 내에서 사용할 때는 값으로 전달되기 때문이다. 엄밀히말하면 const가 된다.

그러므로
chulsoo.count=1;
for(int i=0;i<10;i++){
[&](int steakWeight){cout<<"eatLambda()::철수는"<<chulsoo.count++<<"번째"<<steakWeigt<<"g짜리 스테이크를 먹는다"<<endl;}(1000);
}




3. mutable
chulsoo.count=1;
for(int i=0;i<10;i++){
[=](int steakWeight)mutable{cout<<"eatLambda()::철수는"<<chulsoo.count++<<"번째"<<steakWeigt<<"g짜리 스테이크를 먹는다"<<endl;}(1000);
}
//mutable을 사용하면 값으로 전달받아서캡처하는 [=]일 때도 람다 함수 안에서 외부 변수를 수정할 수있다. 하지만 역시 값에 의한 전달이므로 값을 수정할 수는 없다. 따라서 chulsoo.count++이어도 계속해서 값은 1이다.


5. 반환형

chulsoo.count=1;
//반환형을 char로 지정한 람다함수
cout<<[=](int steakWeight)mutable->char{
 cout<<"~~~~~~~~~~"<<endl; 
                                     return steakWeight}(67)<<endl;

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기