사용하는 한 가지 이유 reinterpret_cast
는 기본 클래스에 vtable이 없지만 파생 클래스가있는 경우입니다. 이 경우, static_cast
및 reinterpret_cast
(이 언급 비정형 될 경우 다른 포인터 값을 초래할 것이다 전술 jalf ). 면책 조항처럼, 이것이 표준의 일부가 아니라 여러 널리 퍼진 컴파일러의 구현이라고 진술하고 있습니다.
예를 들어 아래 코드를 사용하십시오.
#include <cstdio>
class A {
public:
int i;
};
class B : public A {
public:
virtual void func() { }
};
int main()
{
B b;
const A* a = static_cast<A*>(&b);
const A* ar = reinterpret_cast<A*>(&b);
printf("&b = %p\n", &b);
printf(" a = %p\n", a);
printf("ar = %p\n", ar);
printf("difference = %ld\n", (long int)(a - ar));
return 0;
}
다음과 같은 결과가 나옵니다.
& b = 0x7ffe10e68b38
a = 0x7ffe10e68b40
ar = 0x7ffe10e68b38
차이 = 2
내가 시도한 모든 컴파일러 (MSVC 2015 및 2017, clang 8.0.0, gcc 9.2, icc 19.0.1- 마지막 3 은 godbolt 참조 )에서 결과는 2 의 결과 static_cast
와 다릅니다 reinterpret_cast
(MSVC의 경우 4). 차이점에 대해 경고하는 유일한 컴파일러는 다음과 같이 clang이었습니다.
17:16 : 경고 : 'B *'클래스에서 '0이 아닌 오프셋에있는 기본으로'reinterpret_cast ''A * '는'static_cast '와 다르게 동작합니다. [-Wreinterpret-base-class]
const A * ar = reinterpret_cast (& b) ;
^ ~~~~~~~~~~~~~~~~~~~~~~~
17:16 : 참고 : 'static_cast'를 사용하여 업 캐스팅하는 동안 포인터를 올바르게 조정하십시오.
const A * ar = reinterpret_cast (& b) ;
^ ~~~~~~~~~~~~~~~
static_cast
마지막으로주의해야 할 점은 기본 클래스는 데이터 멤버가없는 경우 (예를 들어 있다는 것입니다 int i;
) 다음 그 소리, GCC 및 ICC가 같은 주소를 반환 reinterpret_cast
에 관해서는 static_cast
MSVC 여전히하지 않는 반면,.
reinterpret_cast
런타임에는 발생하지 않습니다. 둘 다 컴파일 타임 문입니다. 에서 en.cppreference.com/w/cpp/language/reinterpret_cast : "달리 static_cast 만에 const_cast처럼 reinterpret_cast 표현은 CPU의 지시에 컴파일되지 않습니다 그것은 순전히 비트의 순서를 처리하도록 컴파일러에 지시 컴파일러 지시어입니다. "new_type 유형 인 것처럼 표현식의 (객체 표현)"