C++20 리서치 - Attributes[3]
Attributes는 C++17에서 추가된 문법입니다.
Attributes는 컴파일러 지시문으로 표준이 나오기 전에는 컴파일러마다 다른 방식으로 사용했습니다.
C++ 20에서 추가된 Attributes는 다음과 같습니다.
- [[nodiscard(“reason”)]]
- [[likely]]
- [[unlikely]]
- [[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
}