Notice
Recent Posts
05-19 02:48
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

프로그래밍 잡화점

if에 관한 고찰 (In C) 본문

C, C++ 분석 보고서

if에 관한 고찰 (In C)

Luana7 2022. 3. 13. 09:00

먼저 GCC의 최적화 방식을 알아보자.
GCC는 상수가 들어왔을 때 해당 값에 따라서 비교하는 명령어(어셈에선 cmp)를 생성하지 않는다. 즉, 다음과 같은 식에서 GCC는 cmp와 je(jump)를 생성하지 않고 바로 내부 코드를 생성한다

if (true) n = 1;
mov    DWORD PTR [rbp-0x4],0x1

 

이 방식은 연산자가 존재할 때에도 성립한다.

if (true || false);
if (true && false);

이 상황에서도 위와 같은 방식이 적용된다. 따라서 if문 내부의 상수의 값이 들어가면 gcc는 이를 먼저 처리하고 그 처리에 따라 뒤에 나올 코드를 넣을지 않넣을지를 결정한다.

추가로 if문 내부 코드가 존재하지 않다면 다음 두가지 경우로 나눠진다.
1. 조건문이 상수인 경우 => 아예 코드 자체를 생성하지 않는다.
2. 조건문에 변수 또는 함수가 존재하는 경우 => 값을 바꾸는 행위나 함수가 존재한다면 실행하고 아닌 경우 생략해버린다

(즉, false가 오고 &&가 오는 상황처럼 초장부터 조건이 성립하지 않는다면 아예 코드가 생성되지 않는 다는 뜻이다)


이번에는 if에 여러 조건이 &&나 ||로 연결되어 있는 경우를 살펴보자.

int n[3];
if (i < 3 && n[i] && IfTrue()) { // DoSomething }

위와 같은 if문이 존재한다고 치자
GCC는 이를 어떻게 처리할까?

실제로 컴파일 하고 역어셈 해보면 알 수 있다.

어셈에서는 cmp를 통해 비교하고 je(equal), jne(not equal), jl(less), jle(less & eqaul), jg(greater), jge(greater & eqaul)과 같은 jump를 통해서 if문을 처리한다.
위 코드를 역어셈 해보면 각 jump문의 위치가 나타난다.

<+53>:    jg     0x11b8 <main+96>
<+66>:    jne    0x11b8 <main+96>
<+81>:    jne    0x11b8 <main+96>

모두 if문의 끝 부분인 96번지로 점프하는 것을 볼 수 있다. 즉, 조건이 하나라도 불만족 한다면 바로 나가버린다는 것이다.
|| 또한 같은 원리로 작동한다. 얘는 반대로 하나라도 만족을 하는 순간 실행하는 위치로 이동하는 것을 볼 수 있다. 

'C, C++ 분석 보고서' 카테고리의 다른 글

struct 반환에 대한 고찰  (2) 2023.04.06
함수의 반환에 대한 고찰  (0) 2022.12.27
main의 반환형에 관한 고찰 (In C)  (2) 2022.05.04
bool과 int의 관계 (In C)  (0) 2022.03.12
for에 관한 작은 고찰 (In C)  (0) 2022.03.11
Comments