Attributes는 C++17에서 추가된 문법입니다.

Attributes는 컴파일러 지시문으로 표준이 나오기 전에는 컴파일러마다 다른 방식으로 사용했습니다.

C++ 20에서 추가된 Attributes는 다음과 같습니다.

  1. [[nodiscard(“reason”)]]
  2. [[likely]]
  3. [[unlikely]]
  4. [[no_unique_address]]

nodiscard

함수의 리턴값을 받아 사용하지 않았을 경우 컴파일 경고 표시

[[nodiscard("무시 하면 안되세요")]] int* MyNew(int size)
{
    return new int[size];
}

// 활용
enum class [[nodiscard("반드시 처리해야 하는 에러코드입니다.")]] ErrCode { OK, NO, FATAL};

// enum class에 nodiscard를 명시 해 둘 경우 이 값을 리턴하는 모든 함수에 적용됨
Errcode GetCode(){ return ErrCode::FATAL; }

// 생성자의 앞에도 사용 가능
class MyClass
{
    [[nodiscard("경고~")]] MyClass(int a, bool b){}
}

likely / unlikey

컴파일러 최적화와 관련되어 있으며, 제어문 등을 만들 때 특정 조건이 발생할 확률이 더 높다/적다는 것을 알려주는 것

if ( i > 1) [[likely]]
	i += 1;
else if( i > 5)
	i -= 1;
else [[unlikely]]
    i -= 2;

no_unique_address

Empty class : non-static 멤버 데이터와 가상함수가 없는 클래스 (크기는 1 byte)

Empty class가 구조체의 멤버로 놓일 때 크기를 0으로 계산시키는 속성입니다.

람다 표현식 등을 컨테이너에 보관 할 때 활용 가능하며, 메모리 최적화에 사용 할 수 있습니다.

struct Empty
{
    void A(){}
};

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

int main()
{
    std::cout << sizeof(Data) << std::endl; // no_unique_address를 붙인 경우 4, 아닐 경우 8
}

더 많은 C++20 관련 정보