반응형
[C++] likely, unlikey 키워드
likely, unlikey는 컴파일러 최적화와 연관된 키워드
• likely | 컴파일러에게 참인 경우가 더 많을 것이라는 정보 제공하여 최적화
• unlikely | 컴파일러에게 거짓인 경우가 더 많을 것
#include <stdio.h>
int main()
{
if (num == 1)
{
// ...
}
else
{
// ...
}
}
컴파일러 num 값이 "1"일 확률 그 외의 값일 확률에 대한
정보가 없기 때문에 이를 최적화 하지 않는다.
if문 성능 최적화를 위해서는 가장 많이 해당하는 분기조건을 상단에 두는 것이다.
이와 같은 방식으로
number 값이 "1" 확률이 높다면 컴파일러에게 힌트를 줄 수 있다.
#include <stdio.h>
int main()
{
if (likely(num == 1))
{
// ...
}
else
{
// ...
}
}
조건이 x 인데 그것에 대한 확률 힌트를 likely, unlikely 로 준다고 보면 된다.
→ 일반적으로 조건문에서 특정 조건이 자주 발생하거나 거의 발생하지 않는 경우
• likely(x): x가 참일 가능성이 높다.
• unlikely(x): x가 거짓일 가능성이 높다. (= 참일 가능성이 낮다.)
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
[예시 코드]
num == 10 일 확률이 높다.
num == 0 일 확률이 낮다.
#include <iostream>
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
int main() {
int num = 10;
if (likely(num == 10)) {
std::cout << "10입니다." << std::endl;
} else {
std::cout << "10이 아닙니다." << std::endl;
}
if (unlikely(num == 0)) {
std::cout << "0입니다." << std::endl;
} else {
std::cout << "0이 아닙니다." << std::endl;
}
}
[예시 코드]
파일을 열어서 내용을 읽고 출력한다고 해보자.
잘못 사용하지 않는 이상
파일 열기(file.is_open)가 잘못될 확률을 낮을 것이다. → unlikely
파일 내용일 잘못 읽힐(file.bad) 확률도 낮을 것이다. → unlikely
#include <iostream>
#include <fstream>
#include <string>
#define unlikely(x) __builtin_expect(!!(x), 0)
void readFile(const std::string& filePath) {
std::ifstream file(filePath);
// 파일 열기 실패할 확률 낮다. (unlikely사용)
if (unlikely(!file.is_open())) {
std::cerr << "Error: Could not open file " << filePath << std::endl;
return;
}
std::string line;
while (std::getline(file, line)) {
// 파일이 정상적으로 읽힐 확률이 높기 때문에 에러 발생 시에만 unlikely 사용
if (unlikely(file.bad())) {
std::cerr << "Error: An error occurred while reading the file." << std::endl;
break;
}
// 문제가 없으면 출력
std::cout << line << std::endl;
}
file.close();
}
int main() {
readFile("example.txt");
return 0;
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[임베디드/펌웨어] Bitmap Based 연산 예시 (5) | 2024.12.01 |
---|---|
[C/C++] packed 키워드 (3) | 2024.11.16 |
[C/C++] 패딩 비트 (Padding Bit) (2) | 2024.11.09 |
[C/C++] struct 차이 비교 (1) | 2024.11.08 |
[C/C++] #define과 const 차이 (7) | 2024.11.02 |
댓글