네, 이식성이 좋지 않습니다. 왜 이런 식으로하고 싶은지 궁금합니다 :`그게 무슨 뜻입니까? reinterpret_cast <char *&> (a) = cp;
char *cp ;
reinterpret_cast<char *&>(a) = cp;
`그리고 그것이 의미하는 것은 무엇입니까?
Thx
네, 이식성이 좋지 않습니다. 왜 이런 식으로하고 싶은지 궁금합니다 :`그게 무슨 뜻입니까? reinterpret_cast <char *&> (a) = cp;
char *cp ;
reinterpret_cast<char *&>(a) = cp;
`그리고 그것이 의미하는 것은 무엇입니까?
Thx
a
는 char*&
에 주조된다. 비트가 캐스트 대상 유형에 의해 요청 된 방식으로 정확하게 재 해석되기 때문에 reinterpret_cast
이라고합니다. 컴파일러는 유효성을 검사하지 않으며 (가능하지도 않습니다). 포인터가 메모리의 원래 주소로 되돌아갑니다. 메모리의 주소 일뿐입니다.
a
이 포인터에 대한 참조로 캐스트 된 이유는 cp
에 할당 할 유효한 lvalue를 갖는 참조가 필요하기 때문입니다. reinterpret_cast<char *>(a) = cp
은 임시로 할당 할 수 없으므로 불법입니다.
소스 코드가 약간 엉망입니다. 이 하나 더 오래 비록
char* c = reinterpret_cast<char*>(a);
c = cp;
은 유지하고 읽을 아마도 더 나은 (우리가 캐스트의 결과를 저장하기 위해 별도의 변수 c
을 도입하고 있기 때문에 정확히 같은 의미는 아니다주의 원래의 샘플에서. , a
의 메모리가 새 위치 cp
을 가리 키기 위해 다시 사용됩니다.
아마도 같은 의미는 아닙니다. 질문의 코드에서'a'의 값은를 가리키고, 반면에 당신의 코드에서는'a'의 값은 변하지 않습니다. 코드를 읽기 쉽고 의미를 유지하는 방법은 실제로 포인터 유형 'a'('a'는'T * '라고 가정)로 변환합니다 :'a = reinterpret_cast
네 말이 맞아, 내 발췌 문장이 잘못되었다. 내 설명에 맞게 편집했습니다. 너의 것이 최선의 방법이다. –
일부 사람들은 캐스트에 대한 참조를 혼동합니다. 기준이 없다면, 우리는이 같은 것이다 :
T a; // whatever a is, we don't know
char* cp; // or something convertible to char*
// remember, this is not what actually gets generated
char* some_temporary_rvalue = reinterpret_cast<char*>(a);
some_temporary_rvalue = cp; // illegal, and senseless
기준으로를, 그것은된다 :
T a; // whatever a is, we don't know
char* cp; // or something convertible to char*
char*& a_treated_as_charptr = reinterpret_cast<char*&>(a);
a_treated_as_charptr = cp; // assigns a char* that is at &a
왜 'a_treated_as_charptr'은 임시 참조를하지 않습니까? 또는 임시로 범위를 유지하는 참조입니까? –
그리고 왜 우리는'a '를'* &'로 캐스팅해야합니까? 왜 우리는 단지 다음과 같이 말할 수 없는가? 'char * & a_treated_as_charptr = reinterpret_cast
STingRay : 'renterpret_cast'가 rvalue를 생성하지 못하도록하는 캐스트의 참조입니다. 참고 문헌으로 "이 유형의 기억 영역을 치료하십시오"라고 말합니다. "이 유형의 메모리로이 영역의 가치를 취급하십시오."사실 두 번째 설명은 불법이며 컴파일되지 않습니다. 임시 변수에 대한 참조를 할당 할 수 있습니다. (내 게시물에서와 같은 과정을 시도해보십시오. 당신은'char * & a_treated_as_charptr = some_temporary_rvalue'라고 말할 것입니다. – GManNickG
흥미로운 부분 질문에서 누락 된 것은 a
의 유형입니다. 나는 그것이 어떤 종류의 포인터라고 가정 할 수있다. (그것은 실제로 아무것도 될 수 있지만, 그 가정은 토론을 더 단순하게 만든다.) a
다른 유형에 대한 포인터가 사실이라는 가정하에
T *a;
char* p = "Hello";
reinterpret_cast<char*&>(a) = p;
, 작업의 결과에 해당 될 것이다 :
T *a;
char *p = "Hello";
a = reinterpret_cast<T*>(p); // convert p to a T* and assign
첫 번째 버전에서, 캐스트인지되는 차이 할당의 왼쪽 (LHS)에서 수행되므로 참조 (왼쪽 값)에 대한 형 변환이어야하며 두 번째 경우에서는 오른쪽 (RHS)에서 형 변환이 수행되므로 rvalue가 충분하고 거기에서 참조로 전송할 필요가 없습니다.
이제 일반 경우에는 두 가지 캐스트에 차이가 있습니다. 캐스팅을 다시 해석하면 메모리를 해당 유형으로 재 해석합니다. a
과 char*
의 유형이 동일한 크기 (위의 가정하에 모든 포인터의 크기가 동일 함) 인 경우 두 작업은 동일하며 동일한 결과를 산출합니다.
반면에 한 유형이 다른 유형보다 크면 두 조작이 동일하지 않습니다. sizeof(a) > sizeof(char*)
첫 번째 버전은 변수를 다시 해석하고 바이트의 a
만 p
값으로 덮어 씁니다.두 번째 경우에는 p
의 메모리 위치에서 sizeof(a)
바이트가 읽히고 (변수에서 읽히지 않으므로 정의되지 않은 동작이 발생 함)이 바이트를 복사하여 a
의 이전 바이트를 모두 덮어 씁니다. 두 번째 p
상기 제 sizeof(a)
바이트 a
을 덮어 반면 sizeof(a) < sizeof(char*)
후 최초 버전이 정의되지 않은 행동을 유발 a
위해 할당 된 공간을 넘어 덮어 경우
반대 간다.
cp 유형을 게시 할 수 있습니까? – JaredPar
@ Jared : 아마도'char *'일 것입니다. 그렇지 않으면 작동하지 않을 것입니다. – GManNickG
예제를 업데이트했지만 형식은 중요하지 않습니다. – vehomzzz