항목2 : #define을 쓰려거든 const, enum, inline을 떠올리자.
2022.05.13
#define을 쓰려거든 const, enum, inline을 떠올리자.
#define 정의명은 오류메세지나 코드에서 구별하기 어렵다.
#define은 클래스 상수를 정의할 수 없고 어떤 형태의 캡슐화 혜택도 못받는다.
1. #define대신 const 사용.
2. const 사용 주의사항
- 상수 포인터를 정의하는 경우엔 포인터가 가르키는 대상까지 const화 해주어야한다.
ex1) const int value = 5; const int* ptr = &value;
ex2) const char* const authorName = "Scott Meyers";
사용할 수 있다면 char* 보단 string을 사용하자.
const std::string authorName("Scott Meyers");
- 클래스 상수 정의하는 경우 상수의 사본 개수가 한 개를 넘지 못하게 하고 싶다면 정적(static) 멤버로 만들자.
3. 배열 멤버를 선언할 때 enum을 사용하자.
enum은 컴파일러 입장에서 참고하는 값이기 때문에 상수 처리된다.
enum은 메모리를 잡아 먹지 않는 장점이 있다.
4. 함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수 우선 생각하자.
#define CALL_WITH_MAX(a, b) f( (a) > (b) ? (a) : (b) )
위 와 같은 예시는 단점이 많다. 매크로의 효율을 유지하고 타입 안정화까지 취할 수 있는 인라인함수에 대한 템플릿 사용.
-> template<typename T>
inline void callWithMax( const T& a, const T& b)
{
f ( a > b ? a : b )
}
T가 정확히 뭔지 모르기 때문에 매개변수로 상수 객체의 주소 참조한다.
책을 읽으면서 찾아본 내용
오버헤드(overhead)
어떤 처리를 하기 위해 들어가는 간접적인 시간, 메모리 할당량
( A의 실행은 단순 10초지만, 안정성 고려해 부가적 B라는 처리를 추가하여 처리시간이 15초 이때 오버헤드는 5초)
인라인 함수(inline function)
내부에서 작성된 코드의 속도와 함수의 장점을 결합하는 방법이다.
컴파일러에서 함수를 인라인 함수로 처리하도록 요청.
컴파일러가 코드를 컴파일하면 모든 인라인 함수가 in-place 확장된다.
즉, 함수 호출이 함수 자체의 내용 복사본으로 대체되어 함수 오버헤드가 제거된다.
단점은 인라인 함수를 자주 호출하거나 함수가 길면 코드를 더 크게 만들게 된다.
인라인화 할 함수는 내부 루프가 없는 짧은 함수에 가장 적합하다.
-> 인라인 함수를 알고 있어야 하지만 최신 컴파일러는 함수를 적절하게 인라인화 하므로 inline 키워들 사용 안해도 된다.
댓글을 작성해보세요.