본문 바로가기
프로그래밍 언어/C++

[C++] likely, unlikey 키워드 구문

by 까망 하르방 2024. 11. 10.
반응형

[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;
}
반응형

댓글