On this page
article
Attribute
개념
- C++11부터 도입된 기능
- 컴파일러에게 추가적인 의미를 부여하기 위한 표준 지시문
- 형식:
[[attribute]]
- 최적화, 경고, 코드 표현력 향상 등을 위해 사용
주요 Attributes 및 버전
Attribute | 도입 버전 | 설명 |
---|---|---|
[[noreturn]] | C++11 | 반환하지 않는 함수임을 명시 (ex: 무한루프, exit ) |
[[carries_dependency]] | C++11 | 멀티스레드 메모리 의존성 힌트 |
[[deprecated]] | C++14 | 사용을 권장하지 않음 |
[[deprecated("reason")]] | C++14 | 사용 비권장 사유를 문자열로 명시 |
[[fallthrough]] | C++17 | switch-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]] |