///////////////////////////////////////////////////////////////////////////////////////
//주제 2. 인라인 함수 - 약간은 어려운 이야기
//1. 함수 호출의 원리 : 마지막 인자 부터 스텍에 넣고 함수로 jmp
//2. 인라인 함수 개념 : 진짜 호출이 아니라 함수 기계어 코드를 통째로 치환
//3. 장점 : 속도가 빠르다.
//4. 단점 : a목적 코드의 크기가 커진다?! -> 오히려 간단한 함수에서는 줄어든다.
//
//////////////////////////////////////////////////////////////////////////////////////
========================= 인라인 함수 1.cpp =========================================
int Add(int a,int b){return a+b;}
inline int Add2(int a, int b){return a+b;}
int main(){
int m1 = Add(1,2); //push 2
//push 1
//call ?Add@@xxxxxx
int m2 = Add2(1,2);
return 0;
}
==================================================================================
=========================== 인라인 함수2.cpp ====================================
//인라인 함수2.cpp
int Add1( int a, int b);
inline int Add2( int a, int b);
int main(){
Add1(1,2);
Add2(1,2);
}
int Add1(int a, int b){return a+b;}
inline int Add2(int a, int b){return a+b;}
//=======================================================================================
//////////////////////////////////////////////////////////////////////////////////////////
//빌드하면 에러가 나옴 Why?
// internal linkage(내부연결) : 임의의 심볼이 (변수, 함수이름) 자신을 선언한 컴파일단위(같은파일)에서만 사용 가능
// ex)static 전역변수, 인라인 함수 , template , 매크로,
// internal linkage 는 헤더에 포함되게 만든다!
//
// externeal linkage*외부연결) : 임의의 심볼이 프로젝트 내의 모든 컴파일 단위에서 사용 가능
// ex) 전역변수, 일반함수,
//
// const 는 C에서는 external 이고 C++ 에서는 internal 이다.
//
// 어셈블리 단에서 보면 일반 함수는 call 을 위해 그 메모리주소값을 비워두고 실행시에 그 주소를 참조한다.
// 하지만 inline 은 컴파일시 그 부분을 전부다 기계어로 올려놓고 그 주소를 참조한다.
//
//////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//인라인 함수와 함수포인터 - 중요하고 어렵습니다.
//1. 인라인 함수는 컴파일 시간 문법이다.
//2. 함수는 자신만의 타입이 없다!! singnature 가 동일한 모든 함수는 같은 타입이다.
//3. 함수 포인터를 사용해서 호출하는 경우 대부분의 컴파일러는 인라인 치환을 할 수 없다.
//4. 왜 중요한가? 라이브러리 설계자 입장을 생각해 보자.
// 라이브러리 개발자는?!
//(A) 성능! - 빨라야 한다!
//(B) 유연성! - 유연성이 있어야 한다.
// 변하지 않는 전체 알고리즘과 변해야하는 정책은 분리하는 것이 좋다. (오른차순 내림차순 )
// C 에서는 변하는 것을 함수 인자화 하면 된다.
//
// 컴파일 상에서 알아서 처리 해준다!!!
////////////////////////////////////////////////////////////////////
/*
void foo(){}
inline void goo(){}
int main(){
foo();
goo();
void(*f)();
int n;
cin >> n;
if(n==0)f=&foo;
else f=&foo;
f();
}
*/
//4
void Sort(int *x , int n, int( *cmp)(int,int)){ //qsort() 라면?!
for(int i =0; i<n-1;i++){
for(int j=i+1;j<n;j++){
if(cmp(x[i]>x[j])>0)swap(x[i],x[j]);
}
}
}
//inline int cmp1(int a, int b){return a-b;} //인라인 함수는 함수 포인터로 호출이 불가능하다. /
//inline int cmp2(int a, int b){return b-a;}
int cmp1(int a, int b){return a-b;}
int cmp2(int a, int b){return b-a;}
int main(){
int x[10] = {1,3,5,7,9,11,2,4,6,8};
Sort ( x, 10,cmp1);
}
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]6. 객체 지향의 탄생 배경을 STACK 소스로 알아보기 (0) | 2012.08.13 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의 ] 5. 참조변수 편 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 4. C++ 캐스팅 (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 3. 메크로와 템플릿?! (0) | 2012.08.13 |
[SSM 안드로이드 프레임워크 개발 강의 ] 1. 함수 오버로딩 (0) | 2012.08.13 |