2017-09-16 8 views
0

두 클래스의 값 유형 멤버가 동일한 메모리 주소를 가리 키도록 초기화하면 초기화 중 하나를 초기화하면 다른 하나를 변경하면 다른 하나가 변경됩니다. 또는 함수 내에서 두 변수가 될 수도 있고 변수 또는 상수 값을 다른 유형으로 변환하는 방법이 될 수도 있습니다.2 명의 클래스 멤버가 동일한 메모리 주소를 가리키게합니다

누군가가 이것을 원할만한 이유 중 가장 쉬운 예는 float의 값을 int로 다시 읽고 조작하고 다시 float으로 다시 읽는 클래식 0x5F3759DF fast inverse square root입니다.

나는 이것을 생생하게 보여주는 블로그 게시물을 읽은 것을 기억하지만, 지금은 찾을 수없는 것 같습니다. 기억이 경우, 셋업이 유사했다 :

class Dummy 
{ 
    // Make these two point to the same memory address, and initializing one would initialize the other 
    Int64 a; 
    Double b; 
} 

아니면 두 변수

함수의 시작 부분에 있었다. 어느 쪽이든, 난 정말 하나를 초기화하는 자동으로 다른 사람을 초기화하고 "초기화되지 않은"오류없이 일할 것이라고 사용하는 기억 해요. 아마도 그들은 두 가지 유형보다는 오히려 같은 유형이었을 것입니다.

FWIW, 저는 현재이 작업을 시도하지 않고 오히려 C#의 기능에 대해 궁금해합니다.

+0

명시 적 필드 오프셋을 사용하여 작업 할 수 있지만 두 배로 명시 적으로 'BitConverter.DoubleToInt64Bits'와 그 반전을 통해 명시 적으로 변환하는 것이 더 쉽습니다. – harold

+1

[C#의 C++ 유니온] 가능한 복제본 (https://stackoverflow.com/questions)/126781/c-union-in-c-sharp) – pvg

+0

필드 대신 속성을 사용하십시오. Int64 A {set; 도망;} – sTrenat

답변

0

원하는 것은 모순입니다. 값 유형 값은 구성원인지 여부에 관계없이 아무 것도 가리 키지 않습니다. 참조 유형 값만 있습니다. 예를 들어 here을 참조하십시오.

파일 시스템에있는 것과 같은 것을 상상하고있는 것처럼 보입니다. 여러 "하드 링크"가 동일한 물리적 위치를 가리킬 수 있습니다. 그러나이 경우에도 여전히 링크입니다. "참조 유형 값". 정수로 부동의 조작과의 예에서

, 당신은 희망 같은 일에 달할 것보다 단순히

void manipulate(my_algorithm_state_t& state) { 
    state.value = actually_manipulate(reinterpret_cast<int32_t>(state.value)); 
} 

struct my_algorithm_state_t { 
    float value; 
} 

void manipulate(my_algorithm_state_t& state) { 
    auto reinterpreted_value = reinterpret_cast<int32_t&>(*state.value); 
    /* ... do stuff with reinterpreted_value*/ 
} 

또는 같은 것을 가지고 있습니다.