[zz] C + + 표준 변환 연산 자 reinterpretcast

9268 단어 cast
C + + 표준 변환 연산 자 reinterpretcast
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 직면 const
IBM 의 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
  • C++ Language Tutorial - Type Casting
  • Object Oriented Design
  • IBM Complilers - XL C/C++ V9.0 for Linux - The reinterpret_cast operator (C++ only)
  • Bjarne Stroustrup's C++ Style and Technique FAQ
  • MSDN Visual C++ Developer Center - reinterpret_cast Operator
  • 좋은 웹페이지 즐겨찾기