<aside> 💡
현대의 컴파일러는 프로그램에서 어떤 값이 계산되는지 결정하는 복잡한 알고리즘을 사용
</aside>
GCC를 비롯하여 대부분의 컴파일러는 최적화 수준 옵션을 제공
Og: 기본 수준 최적화
O1, -O2, -O3: 점차 더 많은 최적화 적용
컴파일러는 안전한 최적화만을 주의 깊게 적용
때문에 프로그래머가 최적화하기 좋은 코드 구조를 직접 작성해야함
<aside> 💡
두 개의 포인터가 같은 메모리 위치를 가리킬 수 있는 경우
</aside>
예시
xp == yp
일 경우,
void twiddle1(long *xp, long *yp) {
*xp += *yp;
*xp += *yp;
}
void twiddle2(long *xp, long *yp) {
*xp += 2 * *yp;
}
위의 코드의 결과
<aside>
twiddle1
: 값이 4배twiddle2
: 값이 3배
</aside>컴파일러는 호출 시 xp == yp
를 확신할 수 없으므로, twiddle1
→ twiddle
변환 불가
또 다른 예시
x = 1000; y = 3000;
*q = y; // 3000
*p = x; // 1000
t1 = *q; // 1000 또는 3000 (alias 여부에 따라 달라짐)
// 연결되어 있다면 1000, 안 되어 있다면 3000
위 예시의 모든 것들이 → 최적화 장애물(Blocker) 이 됨