문제

Andrei Alexandrescu 글을 씁니다 현대 C ++ 디자인:

물체가 반환되었습니다 typeid 정적 저장 공간이 있으므로 평생 문제에 대해 걱정할 필요가 없습니다.

Andrei는 계속됩니다 :

표준은 각각의 호출을 보장하지 않습니다. typeid(int)동일한 참조를 반환합니다 type_info 물체.

표준이이를 보장하지는 않지만 GCC 및 Visual Studio와 같은 공통 컴파일러에서 어떻게 구현됩니까?

가정합니다 typeid 누출되지 않으며 (모든 호출마다 새 인스턴스를 반환) 응용 프로그램 당 하나의 "테이블", DLL/SO에 따라 하나의 "테이블"입니까, 아니면 완전히 다른 것입니까?

언제가 있습니까? &typeid(T) != &typeid(T)?

주로 Windows 용 컴파일러에 관심이 있지만 Linux 및 기타 플랫폼에 대한 정보도 감사합니다.

도움이 되었습니까?

해결책

언제 & typeid (t)! = & typeid (t)가 있습니까?

주로 Windows 용 컴파일러에 관심이 있지만 Linux 및 기타 플랫폼에 대한 정보도 감사합니다.

예. Windows에서 DLL은 해결되지 않은 기호를 가질 수 없습니다. 당신이 가지고 있다면:

foo.h

struct foo { virtual ~foo() {} };

dll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

main.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

당신에게 다른 포인터를 줄 것입니다. dll이로드되기 전에 typeid (foo)는 dll과 1 차 exe에 존재해야합니다.

그에 따라 Linux에서 메인 실행 파일이 -rdynamic (또는 -export -dynamic)로 컴파일되지 않은 경우 TypeID는 실행 파일과 공유 객체 (일반적으로 ELF 플랫폼에서 발생하지 않음)에서 다른 기호로 분해됩니다. 실행 파일을 연결할 때 수행 된 일부 최적화 - 불필요한 기호 제거.

다른 팁

표준은 때때로 구현에 약간의 자유를주기 위해 특정 행동을 지정하지 않게합니다. 이 경우 TypeIDS를 관리하는 방법이 컴파일러 구현에 남아 있으며 단순히 일련의 규칙이 주어지고 있습니다 (본질적으로 :이를 위해 메모리가 할당되는 방법에 관심이 없습니다).

메모리 주소를 기반으로 TypeID를 비교할 수 있어야하는 특별한 이유가 있습니까? typeids는 이미 비교할 수있는 능력을 제공하고 독특하게 식별하는 데 사용될 수있는 이름 ()을 제공하기 위해 이미 재정의 == 및! =입니다.

C ++ 프로그래밍 언어 (Bjarne Stroustrup)를 사용할 수 있다면 15 장에 클래스 계층을 처리하는 것에 대한 많은 세부 사항이 있습니다. 다른 해결책을 찾을 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top