선택지가 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문에만 적용된다는 것을 꼭 기억하시기 바랍니다.
'C++ > C++ 특수 강좌 & 모던 C++' 카테고리의 다른 글
C++20 Concepts 알아보기 (1) (0) | 2022.02.16 |
---|---|
C++ 캐스팅 연산자 성능 비교 (0) | 2022.02.16 |
[C++20 특수 강좌] constexpr을 넘어선 consteval (0) | 2022.02.16 |
[C++심화 강좌] C++20 모듈 사용하기 (0) | 2021.05.15 |