개념

  • C++11부터 도입된 기능
  • 컴파일러에게 추가적인 의미를 부여하기 위한 표준 지시문
  • 형식: [[attribute]]
  • 최적화, 경고, 코드 표현력 향상 등을 위해 사용

주요 Attributes 및 버전

Attribute도입 버전설명
[[noreturn]]C++11반환하지 않는 함수임을 명시 (ex: 무한루프, exit)
[[carries_dependency]]C++11멀티스레드 메모리 의존성 힌트
[[deprecated]]C++14사용을 권장하지 않음
[[deprecated("reason")]]C++14사용 비권장 사유를 문자열로 명시
[[fallthrough]]C++17switch-case에서 fallthrough가 의도된 것임을 명시
[[nodiscard]]C++17반환값을 무시하지 않도록 경고
[[nodiscard("reason")]]C++20반환 무시 경고 + 사유 명시
[[maybe_unused]]C++17사용되지 않을 수도 있는 변수/함수에 경고 방지
[[likely]]C++20분기 조건에서 발생 가능성이 높음을 컴파일러에 전달
[[unlikely]]C++20분기 조건에서 발생 가능성이 낮음을 전달
[[no_unique_address]]C++20멤버가 empty type일 경우 공간 최적화 허용

예제 1: [[nodiscard]]

  enum class [[nodiscard]] ErrorCode { OK, WARNING, CRITICAL, FATAL };

ErrorCode foo() {
    return ErrorCode::CRITICAL;
}

int main() {
    foo(); // 경고: 반환값 무시됨
}
  

예제 2: [[likely]], [[unlikely]]

  int foo(int i) {
    if (i > 0) [[likely]]
        i += 2;
    else [[unlikely]]
        i -= 2;
    return i;
}
  
  • 컴파일러가 분기 예측 최적화를 할 때 힌트로 사용함

예제 3: [[no_unique_address]]

  struct Empty {};

struct Data {
    int x;
    [[no_unique_address]] Empty e;
};

static_assert(sizeof(Data) == sizeof(int));
  
  • Empty는 빈 타입이라 실제로 메모리를 차지하지 않음
  • C++20부터 [[no_unique_address]]로 해당 구조 최적화 가능

요약

목적사용하는 attribute 예시
경고/제약[[nodiscard]], [[deprecated]]
최적화 힌트[[likely]], [[unlikely]], [[noreturn]]
표현 향상[[fallthrough]], [[maybe_unused]]
메모리 최적화[[no_unique_address]]