2010-05-13 5 views
0
void* GetData() 
{ 
    return reinterpret_cast<unsigned char*>(this); 
} 

이 경우 자동 유형 강요가 발생합니까? 어떻게하면 클래스의 객체를 unsigned char *로 변환 할 수 있을까요? ??누구든지이 표현의 의미를 설명 할 수 있습니까?

+0

이 표현식은 g ++에서 컴파일되며 어떻게 든 값을 반환합니다! 이 코드는 실제로 내 코드베이스에서 작동합니다. –

+3

간단한 '리턴 코드'를 통해 캐스트의 이점에 관해서는 누구든지 나를 깨우칠 수 있습니까? 모든 포인터는 암시 적으로'void *'로 변환 될 수 있습니다 (사실이 함수는이를 사용하여'unsigned char * '를 변환합니다). 그래서'this'도 변환 가능합니다. 'unsigned char * '에 처음으로 캐스팅하는 것은 무엇입니까? – sbi

+0

@sbi 저는 OP가 멤버의 클래스 객체의 바이트 레이아웃을 검사하려고 했으므로 반환 유형은 실제로는 'unsigned char *'여야합니다. 그렇지 않으면'void *'로 인터페이싱하는 동안'unsigned char * '를 반환하는 것은 거의 의미가 없습니다. – wilhelmtell

답변

1

다른 게시물에 동의합니다. 이것은 사용자가하려는 의도가 거의 확실하지 않습니다. 그러나이, IIRC는, 당신은 C++ 표준이 보장된다

은 정의되지 않은 동작의 영역을 입력하지 않고 unsigned char * 또는 void * 다시로 (함수 나 멤버 포인터를 포함하지 않음) 모든 종류의 포인터를 변환 할 수 있도록 . 또한또는 unsigned char *의 왼쪽 값 (ISO 14882 : 2003 섹션 3.10.15 참조)을 통해 모든 개체에 액세스 할 수 있습니다. 필자는 임의의 객체 유형에 대한 내부 표현을 검사하기 위해이 기능을 사용했습니다. 이것은 표준에 대한 나의 독해가 정확하다면, "구현 - 정의 된 행위"(분명히 유형의 내부 표현은 구현에 달려있다)에서 나타난다. 예를 들어

,

template<class T> std::vector<unsigned char> to_bytes (const T& t) 
{ 
    const unsigned char *p = reinterpret_cast<const unsigned char *>(&t); 
    return std::vector<unsigned char>(p, p + sizeof(T)); 
} 

개체의 내부 표현의 복사 std::vector<unsigned_char>을 수득하는 템플릿 함수이다.

그러나 반환 할 때 void *으로 전송한다는 사실은 내게 당신이 더 편협하고 더 정의되지 않은 무언가를하고 있다고 의심하게 만듭니다.

+0

벡터를 반환하는 대신 반복기 또는 벡터를 참조로 사용하면이 함수를보다 효율적으로 만들 수 있습니다. 그래도 동적 할당이없는 컴파일 타임에이를 수행 할 수있는 안전하고 적절한 방법이 있는지 궁금하지 않을 수 없습니다. – wilhelmtell

6

난 당신이 아마 잘못된 문제를 해결 잘못된 접근 방식을 취하고있다 불쾌한 덩어리입니다 return reinterpret_cast<unsigned char*>(this);

에 참조 가정합니다. 기술적으로 컴파일러에게 this 포인터의 유형을 unsigned char* 포인터로 다시 해석하도록 요청합니다. 여기서는 아무런 작업도 수행되지 않습니다. 명령문은 컴파일러에게 포인터를 다른 유형으로 생각하도록 지시합니다. 유형을 그렇게 해석하는 것이 잘못된 경우 이는 재앙입니다.

union inspect_klass { 
    klass obj; 
    char bits[sizeof(klass)]; 
}; 

편집 : 당신이 당신의 객체 비트를 검사하려면

당신은 이런 식으로 뭔가를 시도 할 수 있습니다 위의 노동 조합에 대한 나의 신뢰는 지금 흔들리고있다. 아직 사용하지 마십시오.이 트릭이 실제로 망가 졌음을 확인하는 중입니다. : s

+3

노조를 통해 클래스를 검사하는 것은 정의되지 않은 동작입니다. http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c – Cubbi

+0

오 마이. 표준 초안에서 9.5 단락 1 : ... _ "노동 조합의 규모가 가장 큰 데이터 회원을 수용하기에 충분합니다."_ 누구든지이 권리를 얻었음을 확인할 수 있습니까? 이것은 노동 조합 노조의 크기보다 큰 코드는 크기가 비슷한 멤버 중 하나의 크기보다 클 수 있습니다. 뿐만 아니라 두 멤버가 서로 다르게 정렬 될 수 있습니다. – wilhelmtell

+1

@Wilhelm Alignment는 제쳐두고, 표준에서는 일단 멤버 중 하나가 유니온에 액세스하면 다른 멤버를 통해 유니온에 액세스하는 것이 정의되지 않은 동작이라고 말합니다. 물론 트릭은 널리 사용되지만 표준이 말하는 것입니다. –

0

먼저 GetData() 반환 값 형식이 식의 반환 값 형식과 일치하지 않습니다.

reinterpret_cast는 오래된 스타일 C 캐스트와 비슷합니다. 단순히 부호없는 char *에 대한 포인터를 반환하는 것입니다. 그것은 완전히 안전하지 않습니다. 사실상, 바이트 단위로 접근 할 수있는 클래스의 데이터에 대한 뷰를 생성하고 있습니다.

0

엄밀히 말하면, unsigned char *는 바이트 배열입니다. 호출자가 데이터를 직렬화하는 경우에는 매우 논리적 인 작업입니다.

+1

개체를 serialize하는 방법이 있습니다. 이것은 그렇게하는 좋은 방법이 아닙니다. 그것은 위험합니다. 클라이언트는 객체를 재구성 할 때 읽을 바이트 수를 정확히 알고 있어야합니다. C++은이를 수행하는 더 높은 수준의 방법을 제공하므로 오류가 발생하지 않습니다. 그럼 물론 부스트 직렬화 라이브러리 같은 라이브러리가 있습니다. – wilhelmtell

+0

함수의 범위에 대한 언급은 전혀 없습니다. 그것이 사적인 것 외의 것이라면 나는 당신과 동의한다. 아무도 그것을 쓴 것은 그것을 연재 시키려하지 않았다는 것을 의미하지는 않습니다. –

관련 문제