C++里,typeid里的type_info是怎麼構造出來的,或是type_info從來沒有被構造?


std::type_info對象是在編譯的時候決定其內容的,作為靜態數據存在於最終生成的目標代碼里。編譯器會在靜態存儲空間里為這些type_info對象分配空間,並生成代碼來初始化它們的內容。

對於這樣的C++範例代碼:

#include &

class Foo {
public:
virtual ~Foo() { }
};

class Bar: public Foo {
};

Foo foo;
Bar bar;

extern "C" int printf(const char* fmt, ...);

int main(int argc, char* argv[]) {
Foo* obj = argc 1 ? foo : bar;
const char* name = typeid(obj).name();
printf("%s
", name);
return 0;
}

對於遵循Itanium C++ ABI的編譯器(例如GCC和Clang)來說,其中編譯器給生成的初始化type_info的代碼,本質上就跟自己在全局作用域里寫個這樣的C++代碼類似:

type_info _ZTI3Foo("Foo");
type_info _ZTI3Bar("Bar");

(實際生成的代碼里這_ZTI3Foo與_ZTI3Bar是type_info的特定派生類的實例,而不是簡單就直接是type_info的實例。這裡就不具體展開講解了。)

然後根據ABI要求,將指向這些type_info對象的指針放進vtable的合適位置,就完事了。

Visual C++的邏輯也是類似。


推薦閱讀:

你見過哪些很贊的宏定義?
如何利用樹莓派學習Linux及Python?
編程好學嗎?
你們都通過閱讀開源的代碼獲得了哪些跟操作系統和語言無關的技術知識?

TAG:編程 | C編程語言 | C | MicrosoftVisualStudio | 編譯器 |