2012-04-23 5 views
1

표준에 따르면 typeid 연산자는 구현에 따라 달라 지므로 다른 컴파일러에서 컴파일 한 다른 프로세스에서 만든 객체에서 사용하는 것은 의미가 없습니다. 그러나 제공 프로세스가 동일한 컴파일러에 의해 컴파일되는 상황은 무엇입니까?동일한 컴파일러로 컴파일 된 다른 프로세스에서 제공하는 포인터에서 typeid를 사용하는 것이 안전합니까?

+0

왜 유형을 알아야합니까? 깨진 디자인을 나타낼 수 있습니다. –

답변

3

외부 개체가 검사 프로세스가 아닌 자체 프로세스 공간 내에 vtable 포인터를 포함하기 때문에 작동하지 않습니다. 두 실행 가능한 바이너리 이미지가 실행중인 것처럼 주소 공간을 형성 할 수 있다면. 동일한 명령 행 플래그와 함께 사용되는 동일한 컴파일러의 동일한 버전이거나 플랫폼 ABI가 런타임시 정확히 typeid의 작동 방식을 지정하면 OK 일 수 있습니다.

엄밀히 말하면, C++ 객체 모델은 공유 메모리를 수용하지 않습니다. 프로세스간에 전송하기 전에 직렬화해야하며 수신 측에 없을 수있는 C++ 유형을 안전하게 직렬화 할 수있는 방법이 없습니다.

+0

글쎄, 나는 메모리 공유 문제를 고려하지 않았다. 모든 클래스가 라이브러리에 정의되어 있고 각 프로세스의 실행 파일이 라이브러리에 링크되어 있으므로 둘 다 클래스 정의를 갖습니다. 작동할까요? –

+0

@LiuYongtai 대부분의 OS는 주소 공간 무작위 화를 사용하여이를 방지합니다. 문제는 이러한 전략이 합법적 인 사용보다 외부 응용 프로그램 사이에서 확산되거나 제어하려는 바이러스에 더 유용하다는 것입니다. OS에서 모든 프로세스에서 동일한 가상 주소 범위로 라이브러리를로드 할 수는 있지만 좋은 전략은 아니며 모든 OS에서 향후이를 지원하지 않을 수 있습니다. – Potatoswatter