평소 getter/setter 함수는 인라인 함수로 구현했었는데 과제를 진행하는 도중 인라인 함수로 써도 괜찮을지 의문이 들어 찾아보게 되었습니다.
먼저 포르잔 C++ 바이블 책에서 인라인 함수에 대해 잘 명시가 되어있어 관련 내용을 정리했습니다.
함수 본문이 너무 짧으면, 함수를 실행하는 시간(매개변수 저장, 제어 이동, 매개변수 추출, 리턴값 저장 등)이 함수 내부의 코드를 실행하는 시간보다 오래 걸릴 수 있습니다. 프로그램의 성능을 위해서 컴파일러가 함수 호출 부분을 실제 코드로 대체해버리게 만들고 싶을 때는 함수를 인라인 함수로 선언합니다. 물론 컴파일러가 이를 무시할 수도 있으며 인라인 함수는 필요한 곳에서 사용할 수 있습니다.
암묵적 인라인 함수
클래스 정의 내부에 함수를 정의하면, 해당 함수는 인라인 함수가 됩니다. 하지만 이는 2가지 이유로 추천하지 않습니다. 첫 번째로 함수 정의 부분을 읽기 어렵고, 두 번째로 캡슐화 원칙을 위반했기 때문입니다.
class Circle
{
// 데이터 멤버
private:
double radius;
// 멤버 함수
public:
double getRadius() const { return radius; }
...
}
명시적 인라인 함수
함수 정의 앞에 inline 키워드를 추가하면 함수를 명시적 인라인 함수로 만들 수 있습니다.
inline double Circle::getRadius() const
{
return radius;
}
이 책에서는 getter 함수(예시)도 클래스의 구현이 인터페이스와 섞이게 돼서 인라인 함수를 추천하지 않는다고 나와있습니다.
다음으로 Effective C++에서 항목 30에 나온 내용으로는
우선, 아무것도 인라인하지 마세요. 아니면 꼭 인라인해야 하는 함수(항목 46 참조) 혹은 정말 단순한 함수(Person::age 같은 함수)에 한해서만 인라인 함수로 선언하는 것으로 시작하십시오. 인라인을 주의해서 사용하는 버릇을 들여서, 디버깅하고 싶은 부분에서 여러분의 디버거를 제대로 쓸 수 있도록 만드시고, 정말 필요한 위치에 인라인 함수를 놓도록 하세요.
class Person{
public:
int age() const {return theAge;} // 암시적인 인라인 요청: age는
... // 클래스 정의 내부에서 정의되었습니다.
private:
int theAge;
};
여기서는 또 인라인하지 말되 getter 정도의 단순한 함수는 인라인 함수로 써도 괜찮다고 나와있습니다.
튜터님께 질문 + 구글링한 결과 간단한 getter/setter의 경우 성능이나 유지보수성에 큰 차이가 없기 때문에, 개인의 선호도에 따라 선택하면 됩니다. 중요한 것은 프로젝트 내에서 일관성 있게 사용하는 것입니다.
저는 원래 하던대로 인라인 함수로 구현할 것 같습니다.
추가로 과거에 inline 함수에 대해 작성한 글이 있어 첨부하겠습니다.
https://dev0404.tistory.com/12
[Effective C++] 항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자
#define의 문제점#define은 전처리 지시문으로, 컴파일러가 코드를 읽기 전에 텍스트 치환이 이루어집니다.#define ASPECT_RATIO 1.653컴파일러는 ASPECT_RATIO라는 이름을 알 수 없고, 단지 1.653만을 인식합니
dev0404.tistory.com
'내일배움캠프 > TIL' 카테고리의 다른 글
[내일배움캠프 Day24] 개발 환경 설정 (1) | 2025.01.20 |
---|---|
[내일배움캠프 Day23] CH2 팀 프로젝트 (3) | 2025.01.17 |
[내일배움캠프 Day17] C++ 빌드 과정 (1) | 2025.01.09 |
[내일배움캠프 Day16] C++ 3주차 과제 진행 (1) | 2025.01.09 |
[내일배움캠프 Day15] 디자인 패턴 - 구조 패턴 (2) | 2025.01.09 |