2016-06-23 4 views
4
struct Test { 
    void doAction() {} 
}; 

// Create and save into a void* 
void *ptr = new Test; 

// Real use through a Test* 
Test *t = static_cast<Test *>(ptr); 
t->doAction(); 

// Delete 
delete static_cast<Test *>(ptr); 

ptr은 객체의 주소를 저장하는 데에만 사용되며 주소는 객체의 실제 유형으로 역 참조 만됩니다.엄격한 앨리어싱 규칙으로 확인 하시겠습니까?

관계가없는 유형으로 역 참조되지 않으면 엄격한 별칭 규칙이 적용됩니까?

+2

-fstrict-aliasing을 사용하여 GCC를 사용하여 컴파일 –

+4

예, 올바른 유형으로 변환한다는 것을 알고있는 한 괜찮습니다. 제쳐두고, C++ 코드가 C 코드와 상호 작용하는 많은 장소 (주로 비동기 콜백)에서이 작업을 수행 할 수 있습니다. – Arunmu

답변

5

엄격한 별칭 지정은 포인터/참조를 통해 개체에 액세스하려고 할 때만 적용됩니다. void*을 통해 개체에 액세스하려고 시도하지 않으므로 엄격한 별칭 지정 규칙이 적용되지 않습니다. 여기에서 사용자를 보호하는 규칙은 어떤 유형의 포인터도 void*으로 변환 할 수 있도록 허용하는 static_cast의 규칙이므로 당신이 그것을 다시 캐스팅하는 타입이 정확하게 정확히이었습니다.

마찬가지로, 동일한 유형의 포인터는 별칭을 지정할 수 있습니다. 따라서 tstatic_cast<T*>의 결과는 별칭을 사용할 수 있으므로 엄격한 별칭을 위반하지 않습니다.

관련 문제