일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 깃
- HTML
- docker
- dart 언어
- gitlab
- C# delegate
- 도커
- 플러터
- c# winform
- c언어
- 다트 언어
- c# 윈폼
- github
- Python
- Unity
- C++
- git
- jupyter
- Algorithm
- 유니티
- Data Structure
- c# 추상 클래스
- Houdini
- Flutter
- C언어 포인터
- jupyter lab
- vim
- 구조체
- c#
- 포인터
- Today
- Total
nomad-programmer
[Programming/C++] inline 함수 본문
헤더 파일 | 구현 파일 |
클래스의 정의 인라인 멤버 함수 |
멤버 함수의 정의 정적 멤버 함수의 정의 정적 멤버 변수의 정의 |
인라인 함수는 새로운 종류의 함수가 아니고 함수의 속성이다. 멤버가 아닌 함수도 인라인이 될 수 있다.
왜 인라인 함수를 사용할까?
인라인 함수의 기본 개념은 함수를 호출하는 대신 함수의 내용을 그대로 옮겨 놓는 것이다. 아래의 예를 보자.
#include <iostream>
#include <string>
using namespace std;
inline void Func(){
cout<<"aaa"<<endl;
cout<<"bbb"<<endl;
}
int main(int argc, const char * argv[]) {
// 인라인 함수 호출
Func();
return 0;
}
인라인 함수라는 사실을 무시하고 이 프로그램의 실행을 유추해보자. main()함수에서 Func()함수를 호출하면 실행의 흐름이 Func()함수로 이동한다. 그리고 나서 Func()함수를 모두 실행한 후 다시 main()함수로 실행의 흐름을 이동하고 프로그램을 종료한다.
하지만 인라인 함수라는 사실을 적용해서 생각한다면 이러한 추측은 틀린 것이 된다. Func()함수가 인라인인 경우에 컴퓨터는 main()함수를 다음과 같은 소스 코드로 인식한다.
#include <iostream>
#include <string>
using namespace std;
inline void Func(){
cout<<"aaa"<<endl;
cout<<"bbb"<<endl;
}
int main(int argc, const char * argv[]) {
// 인라인 함수 호출
cout<<"aaa"<<endl;
cout<<"bbb"<<endl;
return 0;
}
Func()함수의 내용을 고스란히 main()함수에 옮겨 놓았다. 이것이 바로 함수를 인라인으로 만들었을 때 발생하는 효과다.
인라인 함수를 함수를 호출하는 대신 함수의 내용을 붙여넣는다.
그런데 이렇게 하는 것이 어디에 도움이 될까? 바로 성능과 관련이 있다. 일반적인 함수라면 실행의 흐름이 다른 함수로 넘어갔다가 돌아오는 작업이나, 인자를 복사하는 과정에서 많은 부하(Overhead)가 발생하게 된다. 인라인 함수를 사용하면 이런 작업들이 불필요하게 되므로 시간을 벌 수 있는 것이다.
그렇다면 왜 모든 함수를 인라인으로 만들지 않는 것일까? 부하를 줄이는 대신에 다른 단점을 갖기 때문이다. 인라인 함수를 올바르게 사용하기 위해서는 다음과 같은 가이드라인을 따를 필요가 있다. 이렇게 하면 인라인으로 만듦으로 인해서 발생하는 문제점을 피할 수 있다.
- 함수의 내용이 몇 줄 정도로 아주 짧은 경우에만 인라인 함수로 만들자.
또 한가지 주의할 점은 인라인 함수로 만들고 싶다고 해서 항상 인라인 함수가 되는 것은 아니다. 단지 컴퓨터에게 "될 수 있으면 이 함수를 인라인으로 만들고 싶어" 라고 말할 수 있을 뿐이다. 인라인 함수를 만들지는 컴퓨터가 결정한다.
일반적으로 재귀 함수인 경우나 누군가가 그 함수의 주소를 얻어서 사용하는 경우에는 인라인 함수가 되지 않는다.
인라인 함수 만드는 법
멤버 함수를 인라인으로 만드는 방법에는 두 가지가 있다.
- 클래스의 내부에 정의한 멤버 함수들은 모두 자동으로 인라인 함수가 된다.
- 클래스의 외부에 정의한 멤버 함수는 함수의 정의 앞에 inline 키워드를 추가한다.
인라인 함수는 반드시 헤더 파일에 있어야 한다.
인라인 함수는 반드시 헤더 파일에 위치해야 한다. 인라인 함수가 헤더 파일이 아닌 구현파일에 있을 경우 에러가 나올 수 있음을 기억하자.
인라인 함수의 단점
인라인 함수의 단점은 프로그램의 크기가 커진다는 점이다. 어떤 인라인 함수가 10줄의 코드를 가지고 있다고 하자. 그리고 이 함수를 호출하는 곳이 100군데가 있다고 해 보자.
이 100군데 모두에 이 함수의 내용을 복사하면 전체적으로 10 X 100 줄의 소스 코드가 생기는 셈이다. 그렇기 때문에 긴 함수를 인라인으로 만들지 않는 것이 좋다.
요즘과 같이 하드웨어가 성능이 좋아지고 값이 싸진 상황에서 프로그램의 코드가 커져도 문제가 없을 것이라고 생각할 수 있지만 그것은 오판이다. 인라인 함수를 많이 사용해서 프로그램의 코드가 커지면 오히려 프로그램의 수행 속도가 떨어질 수 있다. 하드디스크에 있는 실행 파일이 메모리에 올라갔다 내려갔다 하는 일이 더욱 자주 반복되기 때문이다.
'Programming > C++' 카테고리의 다른 글
[Programming/C++] 멤버 함수에 대한 포인터 (0) | 2023.01.16 |
---|---|
[Programming/C++] const 함수 (0) | 2023.01.16 |
[Programming/C++] 구조체의 비트 필드 (0) | 2023.01.14 |
[Programming/C++] 포인터와 const의 사용 (0) | 2023.01.09 |
[Programming/C++] 비트 단위 논리 연산의 응용 (with shift bit operator) (0) | 2023.01.08 |