C++/C++ 특수 강좌 & 모던 C++

[C++20 특수 강좌] 선택문 최적화를 위한 [[likely]], [[unlikely]]

카루-R 2022. 2. 16. 14:13
반응형

선택지가 2개 있으면, 그 중 하나를 고를 확률은 일반적으로 50%가 되겠죠.

그러나, 하나가 훨씬 많이 선택될 게 불보듯 뻔한 상황이 있어도, 컴파일러는 그걸 모릅니다.

개발자가 직접 알려줘야 하죠.

그래서 이번에 새로 등장한 특성 [[attribute]] 이 바로 likely입니다.

std::cout << "당신이 한국어를 할 수 있으면 0을, 아니면 1을 입력하세요." << std::endl;

 // int input - 이미 선언했다고 가정합니다.
if (std::cin >> input; input == 0) {  
}

else {  
}

위 경우에는 압도적으로 0이 많을 겁니다. 하지만 if문에서 0이 가장 위에 있고, 가장 먼저 실행될 것이니 별 필요성이 느껴지지 않죠. 다음과 같은 경우라면 어떨까요?

std::cout << "메뉴를 선택하세요 /***/ (1~4)" << std::endl;

swtich (std::cin >> input; input) {
case 1: break;
case 2: break;
case 3: [[fallthrough]];
case 4: exit(0);
}

자, 그런데 대부분의 사람들이 2번 메뉴를 가장 많이 이용한다고 가정합시다. 그런데 컴파일러는 그걸 몰라요. 하지만 개발자는 조금이나마 최적화를 위해 컴파일러에게 알려줘야 합니다. 이 때 likely를 사용합니다.

swtich (std::cin >> input; input) {
case 1: break;
[[likely]] case 2: break;
case 3: [[fallthrough]];
case 4: exit(0);
}

case 바로 앞에다 작성합니다. 이렇게 하면 컴파일러는 다른 어떤 case보다 input == 2일때를 가장 먼저 생각하게 됩니다.

물론, 이 반대도 있겠죠? 사람들이 가장 쓰지 않을법한거, 여기선 4번을 프로그램 종료 기능이라고 하죠. 그럼 웬만해서는 이 종료 기능을 많이 안 쓸 겁니다. (다른 메뉴에 비하면) 그때 unlikely를 사용합니다.

swtich (std::cin >> input; input) {
case 1: break;
case 2: break;
case 3: [[fallthrough]];
[[unlikely]] case 4: exit(0);
}

이렇게 하면 컴파일러는 i == 4인 경우를 가장 마지막에 생각합니다. 여기서 주의할 점은 [[unlikely]]가 4에 걸쳐져 있으므로 i == 4일때를 가장 나중에 생각하는데, case 3에서 [[fallthrough]]가 있는 것 과는 아무런 관련이 없다는 것입니다. case 3이 case 4와 연관된다고 해서 [[unlikely]] 의 효과를 받지는 않아요. [[likely]]와 [[unlikely]]는 해당 특성이 걸쳐진 case 또는 if문에만 적용된다는 것을 꼭 기억하시기 바랍니다.

반응형