C++ std::bit_cast와 reinterpret_cast — 언제 어떤 것을 써야 하는가
백엔드
C++ std::bit_cast와 reinterpret_cast — 언제 어떤 것을 써야 하는가
두줄요약
C++에서 타입 퍼닝과 포인터 변환에 `std::bit_cast`와 `reinterpret_cast`를 어떻게 구분해 써야 하는지 정리했습니다. 엄격한 앨리어싱 규칙과 포인터↔정수 변환의 의미론도 함께 설명했습니다.
핵심 내용
- C++에서 바이트 패턴을 다른 타입으로 해석할 때
std::bit_cast와reinterpret_cast의 의미론 차이 정리 - 타입 퍼닝에는
std::memcpy또는std::bit_cast가 적합하고, 포인터·참조 변환과 포인터↔정수 변환에는reinterpret_cast가 적합 std::bit_cast를 포인터에 쓰면 const 우회와 잘못된 역참조 위험이 있고,reinterpret_cast를 타입 퍼닝에 쓰면 엄격한 앨리어싱 규칙 위반 가능
주의할 점
reinterpret_cast자체는 UB가 아니지만 역참조 시점에 규칙 위반 여부가 결정uint32_t를float*로 직접 접근하는 방식은 엄격한 앨리어싱 규칙 위반std::bit_cast는 같은 크기와 trivial copyable 조건이 필요하며 포인터 변환용으로 오해하면 안 됨
적용해볼 점
- 값의 비트 재해석은
std::bit_cast, 포인터 접근 방식 변경은reinterpret_cast로 구분 - 바이트 단위 접근은
char*,unsigned char*,std::byte*사용 - 포인터↔정수 변환은 표준이 보장하는
reinterpret_cast경로 우선 검토
