Spaurh의 느긋한 블로그



인라인(Inline) 함수 Programming Tip

다음의 글은 C++ 책에 나오는 인라인 함수 대한 글을 요약한 자료로 일반 함수와 인라인 함수의 차이점, 특징, 사용법을 이야기 한다.

1. 일반 함수의 수행
 프로그램이 함수 호출 명령에 도달하면, 그 프로그램은 다음의 ①-⑥의 흐름을 갖는다.

① 함수 호출 명령 다음의 명령 주소를 메모리에 저장
② 스택에 전달인자를 복사
③ 해당 함수의 시작의 메모리 위치로 점프
④ 함수 수행
⑤ 함수 리턴 값을 레지스터에 저장
⑥ ①에서 저장해둔 주소의 명령으로 복귀


2. 인라인 함수
 인라인 함수는 프로그램의 코드들 가운데 컴파일된 함수 코드가 삽입된다. 이는 컴파일러에 의해 해당 인라인 함수가 함수 코드로 대체됨을 뜻한다. 이렇듯 인라인 함수를 사용하면, 프로그램은 해당 코드를 수행하기 위해 위의 일반 함수 수행처럼 메모리에 있는 함수의 주소를 찾아 점프할 필요가 없어지게 되어, 일반 함수보다 약간이나마 빠른 수행 속도를 갖을 수 있다. 그러나 만약 크기가 큰 코드를 가진 함수를 인라인 함수로 사용하고, 10번을 호출게 된다면, 해당 프로그램 코드 사이에 10개의 복사본을 갖게 됨으로써, 메모리 사용면에서 좋지 않을 수 있다. 또한 함수 수행의 속도에서도 일반 함수 크기가 작다면, 함수 수행을 위해 점프하고, 돌아오는 시간이 적으므로 속도로 얻을 수 있는 이익이 작을 수 있다. 그러므로 인라인 함수 사용 시에는 다음과 같은 특징을 꼭 기억하고 있어야 한다.

 짧은 함수를 인라인 함수로 사용해야 한다.
• 함수 호출 비용을 절약한다.
 짧은 인라인 함수는 함수 호출문에 대해 만들어지는 코드보다 목적 코드가 작아질 수 있다.
 캐시 적중율이 높아진다.

 코드 길이가 긴 인라인 함수는 사용하지 말자! 
• 인라인 함수를 남용하게 되면, 컴파일 시에 코드 대체로 인한 목적 코드의 크기가 증가할 수 있다.

③ 가상 함수를 인라인 함수로 만들지 말자!
• 가상 함수는 컴파일 시가 아닌, 프로그램 수행시 결정되므로 컴파일 시에 코드 대체되는 인라인 함수로는 사용될 수 없다.


3. 인라인과 매크로
간단한 처리를 위해 사용되어온 C의 잔재인 매크로들은 문제점을 안고 있으므로 인라인 함수로 고쳐 사용한다.
다음은 숫자를 제곱하는 매크로 함수이다.

#define SQUARE(X) (X*X)

위의 매크로 함수는 X를 전달인자로 보지 않고, 전달인자에 대한 심벌 레이블처럼 행동하게 하여 문자 대치에 의해 작동되어 다음의 문제점을 유발시킨다.

• a = SQUARE(4.5+7.5);
 SQUARE 매크로가 호출되게 되면 다음과 같이 실행된다.
 4.5 + 7.5 * 7.5 + 4.5
 이는 연산자 우선순위에 의해(*은 + 보다 우선순위가 높다) 전혀 다른 결과를 얻게 된다.

• b = SQUARE(a++);
 a++ * a++
 SQUARE 매크로가 호출되어 단순 문자 대치로 작동되어 위와 같은 결과를 초래한다. 그러므로 가급적 위와 같은 매크로는 사용을 지양하고, 다음과 같이 인라인 함수를 사용하도록 한다.

// Calculator.h
class CCalculator
{
...

public:
    double CalcSquare(const double& dblVaule);
};

inline double CCalculator::CalcSquare(const double& dblVaule)
{
    return (dblVaule*dblVaule);
}

[예제 1] 명시적 inline 함수 (개인적으로 선호)


4. 인라인 사용 예
(1) 정의

• inline 한정자를 사용하여 함수를 선언한다.
• inline 함수의 정의는 그것을 호출하는 어떠한 함수보다도 앞에 있어야 한다.

(2) 구현
위의 CCalcuator 클래스 처럼 inline 한정자를 주어 명시적으로 인라인 함수를 구현할 수 있다. 그러나 암시적으로 다음과 같이 설정해도 컴파일러는 이를 인라인 함수로 처리한다.

// Calculator.h
class CCalculator
{
...

public:
    double CalcSquare(const double& dblVaule) { return (dblVaule*dblVaule); }
};

[예제 2] 암시적 inline 함수


(3) 사용
위의 [예제 1]과 [예제 2] 방법 중에서 개인적인 취향에 따라 구현 방법이 다를 것이라 생각된다. 하지만 개인적인으로는 [예제 1]의 방법을 사용하는데, 이는 선언부에는 선언만!하는게 좋다고 생각하고, 코드가 깔끔해 보이는 이유 때문이다. 


※ 참고 자료 
1. Stephen Prata, C++  기초 플러스, 성안당, pp.366-369 
2. Scott Meyers, Effective C++, Addison-Wesley, Item 30 pp.134-139

참고 사이트 Computer Graphic

그래픽스 참고 사이트
http://loger1000.springnote.com/  (Gooddodaje!!!!)
http://www.codesampler.com/oglsrc.htm
http://nehe.gamedev.net/
http://web.cs.wpi.edu/~emmanuel/courses/cs563/S05/

http://www.opengl.org/
http://www.opengl.org/documentation/
http://developer.nvidia.com/page/home.html
http://rkamin.egloos.com/
http://www.debevec.org/
http://blog.naver.com/ljyhs/
http://www.lighthouse3d.com/opengl/glut/index.php?fps
http://oranze.springnote.com/pages/1564420
http://blog.naver.com/susaek0/90022291510
http://www.spacesimulator.net/
http://www.developer.com/lang/other/article.php/2169281
http://www.zeuscmd.com/


개발자 사이트, 블로그
http://webprogrammer.tistory.com
http://sfreak.egloos.com/
http://iamzet.blogspot.com/
http://soonilddang.textcube.com/
http://hi8ar.net/
http://seye2.egloos.com/
http://ilmol.com/wp/
http://iamzet.blogspot.com/

http://blog.naver.com/process3
http://trend21c.tistory.com/
http://redmin697.tistory.com/
http://nahbi.tistory.com/
http://blog.jinbo.net/renegade/
http://boyfox009.egloos.com/
http://2-up.tistory.com/
http://alumio.egloos.com/
http://ubiteam.tistory.com/
http://darkblitz.tistory.com/207
http://jacking.tistory.com/
http://dklee.net/


MFC

http://myfile.hanafos.com/~kukdas/


수학 관련 사이트
http://pythagoras0.springnote.com/

OS 관련 자료
http://fxr.watson.org/
http://www.anthonycargile.info/lxr/http/source
http://wiki.kldp.org/wiki.php/LinuxDeviceDriverSelfStudy - device file system


마이크로소프트 리서치

http://research.microsoft.com/en-us


비전 관련 연구실

http://cvlab.epfl.ch/research/detect/deformable/

http://mind.kaist.ac.kr/mixedreality.php

http://www.doc.ic.ac.uk/~ajd/

http://people.cs.uchicago.edu/~pff/bp/

http://www.bowu.org/

http://www.gavrila.net/Research/Chamfer_System/chamfer_system.html

http://mi.eng.cam.ac.uk/~twd20/

http://www.vis.uky.edu/~dnister

http://www.vision.ee.ethz.ch/members/get_member.cgi?id=1

http://mi.eng.cam.ac.uk/~er258/work/fast.html

http://www.math.uiowa.edu/~atkinson/

http://lrs.icg.tugraz.at/

http://www.markus-enzweiler.de/

http://www.gtsav.gatech.edu/people/mhayes/publications_journal.html

http://www.vision.ee.ethz.ch/~aess/dataset/

http://www.edgarseemann.de/pd/publicationsdb.py

http://vh.icg.tugraz.at/


로보틱스 연구실

http://www.brl.ac.uk/projects.html

http://www.cim.mcgill.ca/

http://www.mein.nagoya-u.ac.jp/activity/index_e.html

http://www.i2r.a-star.edu.sg/Technologies.html

http://www.vision.ee.ethz.ch/~aess/dataset/


c++ rank 계산, 순위 계산 함수 Programming Tip

참고로 오름차순 정렬이다.
기존 값을 array로 만들어 넣으면, 순위값으로 리턴해준다.
값이 변경되므로, 필요하다면 수정할것...



struct mycomparison
{
bool operator() (int* lhs, int* rhs) {return (*lhs) < (*rhs);}
};

void rank(int* srcArray, int n)
{
int **arrayofpointers;
arrayofpointers = new int *[n];
for(int i = 0; i < n; ++i)
{
arrayofpointers[i] = srcArray + i;
}

std::sort(arrayofpointers, arrayofpointers + n, mycomparison());
for(int i = 0; i < n; ++i)
{
*arrayofpointers[i] = i + 1;
}

delete[] arrayofpointers;
}


c++ 2차원 동적 포인터 할당과 해제 Programming Tip

펌글입니다.
오늘은 2차원 배열의 동적할당에 대하여 알아보겠습니다. C 나 C++등 기타 언어를 배우신 분들이라면
동적할당이 무엇인지 잘 알고 계시리라 생각합니다.
간단하게 설명하자면 사용할 메모리의 영역의 크기를 정하지 않고 입력되는 데이터에 따라서
메모리의 크기가 가변적으로 변하는 것을 동적할당이라 생각하시면 되겠습니다. 절대 무한한데이터를 입력할수는 없죠
메모리의 크기가 유한이니 언젠가는 메모리 용량이 넘어서게 될테니까 말이죠 단지 요즈음의 메모리 크기가
워낙에 커졌기 때문에 무한한것처럼 느껴질뿐입니다.

1차원의 경우에는 C++의 경우 동적할당이 아주 쉽습니다. 먼저 포인터형의 변수를 선언해줍니다.
int *value;
선언을 하셨으면 자신이 원하고자하는 크기를 입력받은후에 다음과 같이 하면 끝입니다.
value = new int[Input value] 

해제하는 방법은 더 쉽죠.
delete [] value  배열을 동적할당한 경우 해제할때 꼭 [] 기호를 넣어주셔야 합니다. 안그러면 배열의 시작주소값만 사라지고
뒤의 데이터는 메모리에 계속 남아있게 되니까 말이죠.

이제 2차원 배열을 동적할당으로 선언하고 해제해 보겠습니다.
우선 포인터변수를 선언해줍니다. 이중포인터로 해주시면 되겠습니다.(행과열을 동적할당해야하기때문)
int **value; 선언을 하셨으면 역시 설정할 크기를 입력받은후에 new 를 사용하여 동적할당을 해줍니다. 다만 조금은 다른방법을 사용하게 됩니다. value = new int *[Inputvalue]; for(int i=0; i<Inputvalue; i++){    value[i] = new int [size]; } 먼저 행을 동적할당한후에 열을 다시 동적할당한다고 생각하시면 되겠습니다. 사용을 다한후에는 해제를 해야 메모리에 남는데이터가 없겠죠?? 분해는?!?! 조립의 역순입니다. for(int i=0; i<Inputvalue; i++){      delete []value[i]; } delete []value[]; 위와같이하면 정방형의 2차원배열이(2X2,3X3....) 동적할당되고 해제되게됩니다. 정방형이 아닌 2차원 배열을 선언하실경우에는 값을 따로입력받거나 따로 설정을 해주시면 되겠습니다.

C++ 들로네 삼각화 코드(1) Computer Vision


이론은 잘 알려져 있으므로 생략한다. 위키를 찾아보면 좋다.

오픈 코드를 받을 수 있는 곳은 여기

받아서 사용하는 법은 간단하다
아래처럼 쓰면 된다.

-----------------------------------------------------------------
int nVertices = 200;
for (int i = 0; i < nVertices; i++)
{
int x = rand() % WIDTH;
int y = rand() % HEIGHT;
m_Vertices.insert(vertex(x, y));

m_Triangles.clear();

QueryPerformanceCounter(&start);

Delaunay d;
d.Triangulate(m_Vertices, m_Triangles);
}


결과

시간은 대략 60ms정도 나온다.
이제 추가, 제거 탐색 시간을 줄이는 코드를 작성해야 할듯...

1 2 3 4 5 6 7 8 9 10 다음