reinterpret_cast — reinterpret_cast

reinterpret_cast — reinterpret_cast

reinterpret_cast는 객체의 비트 패턴을 그대로 유지한 채 다른 타입으로 재해석하는 명시적 형 변환이에요.

포인터를 정수로, 정수를 포인터로, 서로 무관한 포인터 타입으로 변환할 때 사용해요. 컴파일 타임에 거의 검사하지 않아서 잘못 쓰면 정의되지 않은 동작이 될 수 있는 위험한 연산자예요.

출처: cppreference

본문

reinterpret_cast는 비트 패턴을 재해석하는 명시적 변환이에요.

문법 (Syntax)

reinterpret_cast< new-type >( expression )

설명 (Explanation)

reinterpret_cast는 다음 변환에 사용돼요.

  • 어떤 객체 포인터를 같은 크기의 다른 객체 포인터 타입으로 (예: int*float*)
  • 포인터를 충분히 큰 정수 타입으로, 또는 그 반대
  • 어떤 함수 포인터를 다른 함수 포인터 타입으로
  • 어떤 객체 포인터를 다른 객체 포인터 타입으로 (정렬 요구가 맞고 수명이 올바른 경우에만 안전)

주의사항

reinterpret_cast<new_type>(expr)로 얻은 포인터를 역참조해 형식 규칙(strict aliasing)을 위반하면, 실제 타입과 다른 타입으로 값을 읽는 것은 정의되지 않은 동작이에요. 예를 들어:

int i = 42;
float* f = reinterpret_cast<float*>(&i);
// *f 를 읽는 것은 정의되지 않은 동작 (strict aliasing 위반)

reinterpret_caststatic_cast보다 훨씬 강력하고 위험해요. 포인터·정수 간 비트 재해석이 필요할 때만 사용하고, 일반적인 타입 변환에는 static_cast를 쓰는 것이 안전해요.

노트 (Notes)

같은 크기의 포인터 간 변환은 허용되지만, 정렬 요구가 맞지 않는 주소에 접근하는 것과 타입 수명 규칙(lifetime)을 무시하면 정의되지 않은 동작이 돼요. void*에서 특정 타입 포인터로 되돌리는 것도 가능하지만, 원래 타입과 다른 타입으로는 재해석하지 않는 게 원칙이에요.

더 알아보기 (Learn more)

cppreference