일반적으로 코드에 if / else가 있다고 가정했을때, 고를 확률은 50%가 된다. 하지만 상대적으로 동작하는 것을 보면 어느 하나를 더 많이 고를 확률이 더 높다.
그래서 C++20에서는 이러한 부분을 최적화하기 위해 [[attribute]]라는 특성이 등장했다.
if(temp == 0){
}
else{
}
위와 같은 경우 0이 많이 들어온다고 가정해봤을때
if문이 먼저 있으므로 가장 먼저 실행되니깐 괜찮다.
하지만 아래와 같은 경우는?
std::cout<<"Chioce Menu : 1-4\n";
int input;
std::cin>>input;
switch (input){
case 1: break;
case 2: break;
case 3: break;
case 4: break;
이런 경우 사람들이 3번 메뉴를 가장 많이 고른다고 가정했을때, 컴파일러는 모른다. 이를 최적화하기 위하여 likely를 사용한다.
switch (input){
case 1: break;
[[likely]] case 2: break;
case 3: break;
case 4: break;
와 같이 사용하면 컴파일러는 다른 case보다 input == 2일때를 가장 먼저 생각한다.
unlikely는 반대를 의미한다. 많이 안사용하는 경우에 [[unlikely]]를 사용하면 가장 마지막에 생각한다.
switch (input){
case 1: break;
[[likely]] case 2: break;
case 3: [[fallthrough]]
[[unlikely]]case 4: break;
근데 여기서 [[fallthrough]] 를 사용하면 case3과 case4와 연관된다고 해서 [[unlikely]]의 효과를 받지는 않는다.
[[likely]]와 [[unlikely]] 모두 해당 특성이 걸쳐진 case, if문에만 적용이 된다.
이러한 처리를 하여 if, case문에서 최적화를 할 수 있다.