2009-11-30 67 views
9

Andrei Alexandrescu中寫道Modern C++ Design什麼時候可以typeid返回不同類型的type_info實例?

通過typeid返回的對象具有 靜態存儲,所以你不必 擔心壽命問題。

安德烈繼續說:

標準不保證 的,比如每次調用,typeid(int) 返回到相同的 type_info對象的引用。

即使標準不能保證這一點,這是如何在普通的編譯器中實現的,比如GCC和Visual Studio?

假設typeid不泄漏(並且每次調用都返回一個新的實例),它是每個應用程序,每個翻譯單元,每個dll/so或者完全不同的一個「表」嗎?

有沒有時間&typeid(T) != &typeid(T)

我主要對Windows編譯器感興趣,但是對於Linux和其他平臺的任何信息也都很感激。

+3

這種自由度的一個重要原因確實是DLL的問題。 – MSalters 2009-12-01 09:48:46

回答

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的(富)應該存在於DLL和主EXE

更多那麼 ,Linux下,如果主可執行未用-rdynamic編譯(或--export動態)然後typeid的將是由於在鏈接可執行文件時執行了一些優化 - 刪除不必要的符號,因此解析爲共享對象中的可執行文件和 中的不同符號(通常在ELF平臺下不會發生)。

1

標準有時會留下某些不明確的行爲,以便給予實現一些自由。在這種情況下,TypeIDs是如何管理的,留給編譯器實現,你只是被賦予了一組規則(本質上:不關心如何分配內存)。

是否有任何特別的原因,你需要能夠根據他們的內存地址比較TypeIds? TypeIds已經覆蓋了==和!=以便爲您提供比較它們的能力,並提供了一個可以用來唯一標識它們的name()。

如果你有C++編程語言(Bjarne Stroustrup),第15章有很多關於處理類層次結構的細節。也許你會在那裏找到另一個解決方案

+3

你有很多優點,但是這不能回答我的問題。我不需要比較地址,我完全對如何在編譯器內部處理它感興趣。 但我在這個問題上的主要興趣是編譯器設計的問題:它是如何以及爲什麼以這種方式實現的。 爲問題添加附加標籤。 – dalle 2009-11-30 11:32:57

相關問題