[zz] C + + 표준 변환 연산 자 reinterpretcast
9268 단어 cast
http://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.html
reinterpret_cast 연산 자 는 유형 간 의 전환 을 처리 하 는 데 사 용 됩 니 다.이것 은 새로운 값 을 만 들 것 입 니 다. 이 값 은 원본 매개 변수 (expressoin) 와 똑 같은 비트 비트 비트 가 있 을 것 입 니 다.
무관 유형 이란 무엇 입 니까?나 는 유형 간 에 어떤 관계 가 있 는 지 설명 할 좋 은 문 서 를 찾 지 못 했다.후반 부 에는 reinterpret캐 스 트우 리 는 정말 한 유형의 비트 위 치 를 다른 유형의 값 으로 마음대로 건 네 줄 수 있 습 니까?사실은 그렇지 않다.
IBM 의 C + + 안내 에 서 는 reinterpretcast 는 가능 합 니 다. 또는 어떤 곳 에서 연산 자 를 바 꾸 어야 합 니까?
포인터 유형 에서 충분 한 정수 유형 정수 유형 이나 매 거 진 유형 에서 포인터 유형 까지 한 지향 함수 의 지침 에서 다른 유형의 지향 함수 의 지침 대상 을 가리 키 는 지침 에서 다른 유형의 대상 을 가리 키 는 지침 하나의 지향 함수 구성원 의 지침 에서 다른 유형의 함수 구성원 을 가리 키 는 지침 클래스 데이터 구성원 을 가리 키 는 지침 에서 다른 유형의 데이터 구성원 을 가리 키 는 지침 하지만 제 가 Xcode 에서 테스트 를 해 봤 는데 사실은 reinterpret캐 스 트 의 사용 은 위 에서 말 한 몇 가지 항목 에 국한 되 지 않 으 며, 어떠한 종류의 포인터 도 서로 바 꿀 수 있 으 며, 컴 파일 오류 가 발생 하지 않 습 니 다.위 에 열거 한 몇 가지 항목 은 Linux 에서 reinterpret 일 수 있 습 니 다.cast 사용 제한, IBM 이 reinterpret 사용 을 추천 할 수도 있 습 니 다.캐 스 트 방식
그래서 결론: reinterpretcast 는 임의의 포인터 (또는 참조) 형식 간 의 변환 에 사 용 됩 니 다.그리고 포인터 와 충분 한 정수 유형 간 의 전환;정수 형식 (매 거 유형 포함) 부터 포인터 형식 까지 크기 를 무시 합 니 다.
('충분 한 정수 유형' 이란 운영 체제 의 매개 변수 에 달 려 있다. 32 비트 운영 체제 라면 성형 (int) 이상 이 필요 하 다. 64 비트 운영 체제 라면 최소한 긴 성형 (long) 이 필요 하 다. 구체 적 인 크기 는 sizeof 연산 자 를 통 해 볼 수 있다.)
reinterpret_cast 는 어떤 역할 을 합 니까?
위 에서 reinterpretcast 소개, reinterpret캐 스 트 는 인종 격 리 를 무시 하고 마음대로 할 수 있 기 때문에 강력 한 연산 자 이다.그러나 생물의 준칙 처럼 자연 규칙 에 부합 되 지 않 는 임 의 교잡 은 오래 생존 하지 못 하 는 종 류 를 얻 을 수 밖 에 없다.임의의 유형 간 에 reinterpret 사용cast, 그 후에 프로그램의 파괴 와 사용 할 수 없습니다.
예 를 들 어 아래 코드
typedef int (*FunctionPointer)(int);
int value = 21;
FunctionPointer funcP;
funcP = reinterpret_cast<FunctionPointer> (&value);
funcP(value);
저 는 먼저 typedef 로 가리 키 는 함수 의 포인터 형식 을 정 의 했 습 니 다. 가리 키 는 함수 가 int 형식 을 매개 변수 로 받 아들 입 니 다.그리고 난 reinterpretcast 는 전체 주 소 를 이 함수 형식 으로 바 꾸 고 해당 변수 에 값 을 부여 합 니 다.마지막 으로 나 는 이 성형 변 수 를 매개 변수 로 가리 키 는 함수 의 포인터 변 수 를 건 네 주 었 다.이 프로 세 스 컴 파일 러 는 모두 성공 적 으로 컴 파일 되 었 으 나, 실행 되면 "EXC BAD ACCESS" 의 실행 오 류 를 얻 을 수 있 습 니 다. 왜냐하면 우 리 는 funcp 가 가리 키 는 주 소 를 통 해 함수 입구 가 아니 기 때 문 입 니 다.
이로써 알 수 있 듯 이 reinterpret캐 스 트 는 강해 보이 지만 역할 은 그리 넓 지 않다.IBM 의 C + + 안내, C + + 의 아버지 Bjarne Stroustrup FAQ 페이지 와 MSDN 의 Visual C + + 도 reinterpret 를 잘못 사용 했다 고 지적 했다.cast 는 프로그램의 불안정 을 초래 하기 쉽 습 니 다. 변 환 된 형식 값 을 원본 형식 으로 변환 해 야 reinterpret 를 정확하게 사용 할 수 있 습 니 다.캐 스 트 방식.
이렇게 말 하면 reinterpret캐 스 트 를 다른 유형 으로 바 꾸 는 목적 은 임시로 자신의 무엇 을 숨 기 는 것 입 니 다. (스파이 를 하 시 겠 습 니까?) 그 값 을 사용 하려 면 정 체 를 드 러 내야 합 니까?그렇다면 그것 은 도대체 C + + 에 어떤 가치 가 있 습 니까?
MSDN 의 Visual C + + Developer Center 해시 함 수 를 보조 하기 위해 사용 가 치 를 주 었 습 니 다.다음은 MSNDN 의 예 입 니 다.
// expre_reinterpret_cast_Operator.cpp
// compile with: /EHsc
#include <iostream>
// Returns a hash code based on an address
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
using namespace std;
int main() {
int a[20];
for ( int i = 0; i < 20; i++ )
cout << Hash( a + i ) << endl;
}
// 64 , unsigned int unsigned long 。
이 코드 는 해시 의 사상 을 나타 내 는 데 적합 하 다. 잠시 깊이 연구 하지 않 지만 적어도 Hash 함수 안의 조작 을 보면 정수 에 대한 조작 이 주소 조작 에 더욱 편리 해 야 한 다 는 것 을 알 수 있다.집합 에 성형 수 치 를 저장 하 는 것 도 저장 주소 보다 확장 성 이 있어 야 합 니 다 (물론 void * 확장 성도 마찬가지 로 높 습 니 다). 유일한 손실 은 액세스 할 때 성형 과 주소 의 변환 일 수 있 습 니 다 (이것 은 무시 할 수 있 습 니 다).
그러나 가 독성 이 높 지 않 을 수 있 기 때문에 이 경우 type: def 로 포인터 종 류 를 정의 할 수 있 습 니 다.
typedef unsigned int PointerType;
이것 은 더 좋 은 것 이 아니다. 우리 가 64 비트 기계 에서 운행 할 때 다음 과 같이 바 꾸 기만 하면 된다. typedef unsigned long PointerType;
reinterpretcast 직면 constIBM 의 C + + 안내 지적: reinterpretcast const 같 으 면 안 돼 요.cast 처럼 const 수식 자 를 제거 합 니 다.이게 무슨 뜻 이 죠?코드 는 가장 직관 적 인 표현 이다.
int main()
{
typedef void (*FunctionPointer)(int);
int value = 21;
const int* pointer = &value;
//int * pointer_r = reinterpret_cast<int*> (pointer);
// Error: reinterpret_cast from type 'const int*' to type 'int*' casts away constness
FunctionPointer funcP = reinterpret_cast<FunctionPointer> (pointer);
}
예 를 들 어 우 리 는 앞에서 const_캐 스 트 한 편 들 었 던 예 처럼 const 를 가리 키 는 지침 을 연산 자 를 비 지향 const 의 지침 으로 바 꾸 고 싶 습 니 다.하지만 reinterpret캐 스 트 를 할 때 컴 파일 러 는 이 과정 을 직접 잘못 보고 했다.이것 은 const 를 구현 하 였 다캐 스 트 의 독특한 점.그러나 예 에서 또 하나의 변환 은 const int 를 가리 키 는 지침 을 가리 키 는 함수 의 지침 에 지불 하고 컴 파일 이 순조롭게 컴 파일 을 통과 하 는 것 이다. 물론 결 과 는 앞의 예 와 마찬가지 로 무의미 할 것 이다.
만약 우리 가 다른 각도 에서 본다 면 이것 도 합 리 적 인 것 같다.왜냐하면
이 두 문장의 의 미 는 다르다. 전 자 는 '가리 키 는 내용 은 변 할 수 없다' 고 하고 후 자 는 '가리 키 는 주소 가 변 할 수 없다' 구체 적 인 것 은 이곳 을 참고 하 시 오.따라서 함 수 를 가리 키 는 지침 은 기본적으로 '가리 키 는 내용 이 변 하지 않 는 다' 는 특성 을 가지 고 있어 야 한다.
함수 가 컴 파일 된 후에 그 조작 과정 은 거기에 고정 되 었 기 때문에 우리 가 할 수 있 는 유일한 것 은 일부 매개 변 수 를 지침 에 전달 하 는 것 이 고 이미 컴 파일 된 함수 의 과정 을 바 꿀 수 없다.그래서 이런 측면 에서 보면 위의 예 는 reinterpret 를 사용 합 니 다.cast 는 const int * 에서 Function Pointer 로 전환 하 는 것 이 합 리 적 입 니 다. const 제한 을 제거 하지 않 았 기 때 문 입 니 다.
Director:
Jim Fawcett
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UnrealC++로 구조체(USTURCT)를 캐스트해 보기리플렉션이란 런타임시 프로그램의 구조(클래스의 상속 관계나 어떤 함수나 변수를 가지고 있는지 등...) 취득하거나 설정하거나 할 수 있는 구조입니다. 표준 C++에는 현재 리플렉션 기능이 없지만 UnrealC++에는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.