[C++20] 선택문 최적화 [[likely]], [[unlikely]]

연두비두밥·2024년 2월 6일
post-thumbnail

[[attribute]] 등장

일반적으로 코드에 if / else가 있다고 가정했을때, 고를 확률은 50%가 된다. 하지만 상대적으로 동작하는 것을 보면 어느 하나를 더 많이 고를 확률이 더 높다.
그래서 C++20에서는 이러한 부분을 최적화하기 위해 [[attribute]]라는 특성이 등장했다.

if(temp == 0){
}
else{
}

위와 같은 경우 0이 많이 들어온다고 가정해봤을때
if문이 먼저 있으므로 가장 먼저 실행되니깐 괜찮다.
하지만 아래와 같은 경우는?

[[likely]]

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는 반대를 의미한다. 많이 안사용하는 경우에 [[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문에서 최적화를 할 수 있다.

참고 C++ cppreference

profile
꾸준하고 싶은 사람

0개의 댓글