속성은 코드가 다른 컴파일러에서 실행되는 경우 항목을 표준화하는 C++의 최신 방법입니다. 속성은 조건(제약조건), 최적화를 시행하고 필요한 경우 특정 코드 생성을 수행하는 데 사용되는 몇 가지 추가 정보를 제공하는 데 사용됩니다.
이것은 컴파일러가 코드의 성능을 향상시키는 일부 시행을 수행하기 위한 정보 매뉴얼과 같습니다. 속성은 C++ 11에서 처음 표시되었습니다. 그 이후로 프로그래밍 언어의 중요한 부분입니다. 또한 모든 버전에서 더 강력하고 더 나은 것을 만들기 위해 지속적으로 일부 수정이 이루어집니다.
C++에서 속성을 정의하는 방법을 살펴보겠습니다.
C++ 버전에 따라 속성을 정의하는 구문이 다릅니다.
C++ 11에서 속성을 생성하기 위한 구문 -
[[attribute-list]]
C++ 17에서 속성을 생성하기 위한 구문 -
[[using attribute-namespace : attribute_list]]
C++ 20에서 속성을 생성하기 위한 구문(곧 공개될 예정) −
[[contract-attriubute-token contract-level-identifier : expression]]
변수, 함수, 클래스와 함께 많은 속성을 사용할 수 있습니다.
이제 우리는 속성이 무엇인지, 어떻게 작동하는지, 어떻게 정의되는지 알고 있습니다. C++에서 사용할 수 있는 다양한 표준 속성을 살펴보겠습니다.
C++ 11에 도입된 속성
노레턴 − 이 속성은 함수가 값을 반환하지 않는다는 것을 컴파일러에 알리는 데 사용됩니다.
구문
[[noreturn]]
예시
[[noreturn]] void f();
이 함수는 어떤 값도 반환하지 않습니다. 심지어 void도 아닙니다.
C++에서 사용할 때 noreturn 속성을 사용하면 무한 루프나 오류가 발생한 경우와 같이 문제가 발생하고 흐름이 호출 코드로 돌아가지 않을 경우 컴파일러에서 경고를 반환할 수 있습니다.
carries_dependency − 이것은 릴리스 소비에 있는 모든 종속성을 정의하는 데 사용되며 컴파일러가 불필요한 메모리 소비 명령을 거치지 않고 최적화할 수 있도록 합니다.
구문
[[carries_dependency]]
이것은 주로 종속성을 선언하기 위해 함수 또는 매개변수의 선언과 함께 사용됩니다.
지원 중단 - 코드에서 더 이상 사용되지 않는 엔터티를 정의하는 데 사용됩니다. 이 더 이상 사용되지 않는 엔티티의 사용은 허용되지만 사용하지 않는 것이 좋습니다.
구문
[[deprecated]] [[deprecated (reason)]]
이유는 감가상각이 완료된 이유와 사용 중단된 엔티티에 대한 대안을 제공하는 문자열입니다.
더 이상 사용되지 않을 수 있는 엔터티는 클래스, 구조, 공용체, typedef-name, 정적 멤버, 함수, 네임스페이스, 열거형입니다.
폴스루 − 이것은 다음 케이스로의 폴스루가 의도적임을 컴파일러에 표시하는 데 사용됩니다. 이로 인해 컴파일러는 폴스루를 경고하지 않습니다.
구문
[[fallthrough]]
다음 사례가 정의되어 있으므로 fallthrough는 스위치에만 사용할 수 있습니다.
취소 − 이것은 void 호출로 캐스트하는 대신 폐기된 값 표현식에서 호출되는 열거형을 반환하는 함수에 사용됩니다. 컴파일러는 이에 대한 경고도 발행합니다.
구문
[[nodiscard]] [[nodiscard (reason)]] (added in C++ 20)
이유는 결과를 버리지 않는 이유를 제공하는 데 사용되는 문자열이며 이는 C++ 20에 포함될 예정입니다.
미사용 − 사용하지 않는 엔터티의 경우 표시되는 경고를 표시하지 않거나 제거하도록 컴파일러에 지시하는 데 사용됩니다.
구문
[[maybe_unused]]
Maybe_unused로 선언할 수 있는 엔티티는 클래스, 구조체, 공용체, typedef-name, 정적 멤버, 함수, 변수, 열거형입니다.
가능성 있음, 가능성 없음 − 이들은 날씨를 정의하는 데 사용됩니다. 대체 경로가 현재 실행될 가능성이 더 많거나 적습니다.
구문
[[likely]] [[unlikely]]
이들은 일반적으로 레이블 및 명령문과 같이 프로그램의 흐름을 변경하는 엔티티에 적용됩니다.
no_unique_address − 특정 주소가 필요 없는 데이터 멤버를 정의하는 데 사용됩니다. 일반적으로 메모리 할당이 필요하지 않은 비정적 데이터 멤버의 경우에 사용됩니다.
구문
[[no_unique_address]]
이것은 컴파일러가 일반 변수와 no_unique_address 변수 사이에 메모리 위치를 할당해야 할 때 유용합니다. 컴파일러는 전자의 우선 순위를 지정합니다.
Optimize_for_synchronized − 주어진 함수의 정의가 동기화된 문에서 호출되도록 최적화되어야 함을 정의하는 데 사용됩니다.
구문
[[optimize_for_synchronized]]
optimize_for_synchronized로 정의된 함수는 동기화된 블록의 직렬화를 방지합니다.
기대 − 함수가 실행되기 위한 함수의 인수에 필요한 조건을 지정합니다.
구문
[[expects : condition]]
condition은 함수가 실행되기 위해 충족되어야 하는 조건을 정의했습니다.
이것들은 C++ 11에서 C++ 20까지 C++로 정의된 모든 속성이었습니다. 이제 이러한 속성이 프로그래밍에서 사용되는 이유, 즉 제안된 속성이 해결하는 것은 무엇인가요?
-
코드에 제약 조건을 추가하려면 − 많은 경우 속성은 코드에 의미를 추가하고 코드를 더 유효하게 만들고 추가 노력을 줄여줍니다.
-
컴파일러에 더 많은 최적화 정보 제공 − fallthrough와 같은 일부 속성은 아마도 특정 최적화를 수행하기 위해 컴파일러에 정보를 제공합니다.
-
경고 및 오류 탈출 − 때때로 프로그래머의 논리는 C++의 엄격한 규칙에 어긋납니다. 이것은 일부 속성이 재생되어 사용자가 발생할 경고를 피하거나 억제하는 데 도움이 되는 경우입니다.