1️⃣ inline
- 컴파일러에게 판단을 맡겨 최적화 진행을 요청함.
- 일반적으로 함수는 스택 메모리를 사용.
- 재귀함수가 그래서 비효율적이었던 이유.
- 함수 하나에서 다 해결하는 것이 아니라 여러번 호출해서 해결
inline 기능
- inline 키워드가 붙은 함수가 다른 함수 내에서 호출될 때, 새로운 스택 영역을 만들지 않고
하나의 함수 내에서 마치 같은 코드인 것처럼 컴파일러가 작동하는 것.
- 코드를 복사 붙여 사용하는 처리와 작동이 유사함.
분할 구현 시 inline
- 그간 템플릿을 사용해서 클래스르 만들다보니 헤더에 모든 구현이 들어갔음.
- 일반 클래스는 본래대로 헤더, cpp 분할 구현
- 만약 헤더에 구현한다면, inline 처리로 받아들임
- 즉, 새로운 함수 호출 구역으로 처리하지 않음.
비효율
- inline의 경우, 코드를 복사붙여넣기 하는 것이라 했는데 매번 그런 것은 아님.
- 너무 큰 기능, 길이의 함수는 inline으로 처리하면 빌드 시 그만큼 용량을 차지할 것.
- 이런 함수는 컴파일러가 알아서 복사 붙여넣기하지 않을 수도 있음. => 자체적으로 다른 최적화를 할 수 있음.
inline 사용처
- 짧은 길이 + 빈번한 호출 : 이런 경우의 함수는 inline 처리하는 것이 효율적인 것.
- 단순히 값을 한두줄로 반환하거나, begin(), end(), get, set 류의 함수들이 유리함.
- 그래서 이런 getter, setter 등등은 inline처리해서 클래스에 바로 구현해두는 것.
2️⃣ 열거형 enum
enum MY_TYPE
{
TYPE_1,
TYPE_2,
TYPE_3,
TYPE_4 = 100,
TYPE_5,
};
int main()
{
int a = TYPE_1;
return 0;
}
중복 선언
enum MY_TYPE
{
TYPE_1,
TYPE_2,
TYPE_3,
TYPE_4 = 100,
TYPE_5,
};
enum OTHER_TYPE
{
TYPE_1,
TYPE_11,
};
- 위와 같이 명칭이 겹칠 경우 재정의 오류가 발생함.
enum class
enum class CLASS_TYPE
{
TYPE_1 = 1,
}
int main()
{
CLASS_TYPE::TYPE_1;
int a = (int)CLASS_TYPE::TYPE_1;
return;
}
- class 타입이 붙다보니 int로 바꾸기 위해선 명시적 형변환이 필요함.
- 또한 class가 붙어서 다른 열거형의 변수와 이름이 겹쳐도 구분이 가능함.
최근 컴파일러는 일반 enum을 쓰면 enum class를 사용하도록 경고를 보내기도 함.
enum vs 전처리기
#define CLASS_1 0
int main()
{
int a = CLASS_1;
return 0;
}
enum class CLASS_TYPE
{
TYPE_1 = 1,
}
int main()
{
int a = (int)CLASS_TYPE::TYPE_1;
return 0;
}
- 이 코드는 디버깅을 해서볼 때, 1이란 숫자를 넣은 것이 아니라
CLASS_TYPE 타입의 TYPE_1 값을 넣은 것으로 표시됨.
- 정확한 타입이 명시되는 것.
- 컴파일러에서 명확하게 인식할 수 있으므로 좀 더 많은 정보를 얻을 수 있음.
- enum의 의의 자체가 단순한 숫자로 사용할 값이더라도
코드의 사용을 이해하기 쉽도록 문자열에 대응시켜서 사용하는 것이
- 즉, 유지보수 측면, 가독성의 편의성을 향상시키기 위한 것.
- 그러므로 일반적인 define을 사용해서 값을 대신 사용하는 것에는 이런 차이가 있음.