P.5: Prefer compile-time checking to run-time checking
이유
컴파일 타임에 에러를 미리 탐지하고 해결한다면 불필요한 시간 낭비가 줄며,
런타임에 별도의 에러 검증 로직이 돌지 않기 때문에 프로그램의 성능에도 영향을 미치지 않습니다.
예시 (나쁜 예)
// 이렇게 작성하지 마세요
int bits = 0;
// 1을 왼쪽으로 밀면서 오버플로우가 발생할때를 체크합니다
// 오버플로우가 발생한 순간 int 의 실제 크기를 알 수 있습니다
for (int i = 1; i; i <<= 1)
++bits;
// int는 16비트 환경에선 2바이트(=16비트) 일 때도 있답니다 🤪
if (bits < 32)
cerr << "int too small\n";
이렇게 불필요하게 for 문을 돌리지 않고도 static_assert 를 사용하면 컴파일 타임에 간단하게 int 크기를 평가할 수 있습니다.
예시 (좋은 예)
// 이렇게 컴파일 타임에 int 크기를 검증하면 성능 저하도 없고 보기 깔끔합니다
static_assert(sizeof(int) >= 4);
사실 아주 훌륭한 예시는 아닙니다.
고정 사이즈 타입 int32_t 를 사용하면 크기를 항상 보장받을 수 있기 때문에 int32_t 를 사용하는 편이 더 효율적입니다.
정리
1. 컴파일 타임에 쉽게 수행할 수 있는 검증 작업을 런타임으로 미루지 마세요.
2. static_assert 를 사용해서 컴파일 타임에 코드를 평가하고 컴파일 오류를 발생시켜 사고를 미리 방지하세요.
3. type traits, enable_if 등을 사용해서 더 다양한 조건들을 컴파일 타임에 검사하고 코드를 안전하게 만드세요.
참고자료
https://en.cppreference.com/w/cpp/header/type_traits
'C++' 카테고리의 다른 글
[C++ Core Guidelines] P.7 런타임 에러는 빨리 잡자 (0) | 2024.04.13 |
---|---|
[C++ Core Guidelines] P.6 컴파일 타임에 평가가 불가능한 코드는 런타임에서라도 평가되도록 하자 (0) | 2024.04.11 |
[C++ Core Guidelines] P.4 가급적 컴파일 타임 타입을 사용하자 (0) | 2024.04.07 |
[C++ Core Guidelines] P.2 ISO 표준 C++ 코드로 작성하자 (0) | 2024.03.30 |
[C++ Core Guidelines] P.1, P.3 생각을 코드로 직접 나타내자 (2) | 2024.03.27 |