본문 바로가기
C++

[C++ Core Guidelines] P.5 가급적 컴파일 타임에 코드가 평가될 수 있도록 만들자

by 코드쉼터 2024. 4. 11.

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