2009-11-30 5 views
9

Andrei AlexandrescuModern C++ Design의 글 : typeid에 의해 반환typeid는 언제 같은 유형의 다른 type_info 인스턴스를 반환 할 수 있습니까?

개체는 정적 스토리지를 가지고, 그래서 당신은 평생 문제에 대한 걱정할 필요가 없습니다.

안드레이 계속 :

이 표준은 말, 호출 할 때마다, typeid(int) 이 같은 type_info 객체에 대한 참조를 반환 보장하지 않습니다.

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

typeid은 응용 프로그램마다, 번역 단위당, dll/so마다 또는 완전히 다른 무언가가 누출되지 않고 새 호출을 반환한다고 가정합니다.

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

저는 주로 Windows 용 컴파일러에 관심이 있지만 Linux 및 기타 플랫폼 용 정보도 환영합니다.

+3

이 자유도의 중요한 이유는 실제로 DLL에 대한 우려였습니다. – MSalters

답변

10

& 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과 기본 exe 모두

그 이상의 경우 Linux에서는 주 실행 파일이 -rdynamic (또는 --export-dynamic)으로 컴파일되지 않은 경우 typeid가 실행 파일을 서로 다른 심볼로 해석하고 실행 파일을 링크 할 때 수행되는 최적화로 인해 공유 오브젝트에서 (일반적으로 ELF 플랫폼에서는 발생하지 않음) - 불필요한 심볼 제거.

1

표준에 구현을 자유롭게하기 위해 특정 동작을 지정하지 않는 경우가 있습니다. 이 경우 TypeID를 관리하는 방법이 컴파일러 구현에 맡겨져 있고 규칙 집합 만 제공됩니다 (본질적으로이 메모리를 할당하는 방법에 신경 쓰지 마십시오).

메모리 주소에 따라 TypeIds를 비교해야하는 특별한 이유가 있습니까? TypeIds는 이미 == 및! =를 재정 의하여 비교할 수 있으며 고유하게 식별하는 데 사용할 수있는 이름()을 제공합니다.

C++ 프로그래밍 언어 (Bjarne Stroustrup)를 사용할 수있는 경우 15 장은 클래스 계층 구조를 다루는 방법에 대해 자세히 설명합니다. 어쩌면 거기에 다른 해결책을 찾을 수 있을까요?

+3

많은 좋은 점이 있지만 내 질문에 답할 수 없습니다. 주소를 비교할 필요가 없으며 컴파일러에서 내부적으로 처리되는 방식에 전적으로 관심이 있습니다. 그러나이 문제에 대한 나의 주요 관심사는 컴파일러 디자인의 문제입니다. 어떻게 그리고 왜 이런 방식으로 구현됩니까? 질문에 태그를 추가합니다. – dalle