포인터 캐스트로 타입 퍼닝했다가 -O2에서 조용히 깨진 이유

Type Punning in C and C++

C와 C++에서 타입 퍼닝을 안전하게 하는 방법은 union과 memcpy뿐이다. 포인터 캐스트는 모든 컴파일러에서 '작동'하지만 엄격한 앨리어싱 규칙 위반으로 정의되지 않은 동작이다. C++은 타입을 일급 시민으로 취급해 컴파일러가 서로 다른 타입이 절대 겹치지 않는다고 가정하므로, -O2에서 코드가 조용히 최적화되어 사라질 수 있다. float*를 uint32_t*로 캐스팅한 핫 루프가 바로 그 예다.

포인터 캐스트는 '작동'하다가 어느 순간 작동하지 않는다. 그리고 '작동하지 않는다'는 것은 컴파일러가 실행된다고 생각한 코드를 조용히 최적화해 없애버린다는 뜻이다.

이 날의 다른 글

2026-09-22