typeid 使用說明

2021-08-25 20:21:27 字數 1751 閱讀 8364

//z 2011-05-10 20:04:52@is2120

tag: c++ typeid 實現 使用 用法

typeid是什麼?

是c++的乙個操作符,用於獲取乙個表示式的型別

typeid如何實現

typeid (5.3.7): find vtable, through that find most derived class object, then extract type_info from that object's vtable. it is still very slow comparing with function call;

typeid使用的幾種情況:

1. 操作型別是內建型別或是常量

int i;

cout << typeid(i).name() << endl;//z 輸出:int

cout << typeid(0.0f).name() << endl; //z 輸出:double

//z 2011-05-10 20:04:52@is2120

2. 操作型別為類型別

分兩種情況

2.1 類不帶虛函式

typeid會指出運算元的型別,而不是底層物件的型別。

class b{};

class d:public b {};

d d;

b* pb = &d;//z 此時pb實際指向的底層型別為derived

cout << typeid(*pd).name() <

(在vc下,使用typeid的時候,如果typeid施加給的型別是沒有vptr的class或者根本不是class

那麼彙編是

movdwordptr[addr],offseta`rttitypedescriptor'(42ad40h)

也就是編譯器生成乙個簡單的type_info物件的表,並且在編譯期靜態決定下標,做乙個簡單查表操作。 )

2.2 帶虛函式

class b};

class d:public b{};

d d;

b* pb = &d;

cout << typeid(*pb).name() << endl;//z 輸出d

3. 操作型別為乙個指標時

就如同1一樣了,會輸出運算元的型別,而不是其底層指向的型別。

乙個例子:

//z 2011-05-10 20:04:52@is2120

#include

#include

using namespace std;

class b;};

class d : public b;};

int main()

/* 輸出如下:

class d

class d

class b *

class d

class d *

class d

*/4. 是否會對效率造成影響(cost,overhead)

為實現typeid,需要在vtable中新增乙個指標,指向type information structure。

同普通的成員函式(function call)比起來,會慢一些

但是具有虛函式的類總是建立和初始化vtable,這裡只是增加了乙個指標,所以不會帶來什麼效能上的開銷。

5. 環境

vc下,通過/gr 啟用rtti

gcc預設是啟用的,可以通過 -fno-rtti 選項禁用

//z 2011-05-10 20:04:52@is2120

使用說明 附註工具使用說明

附註工具使用說明 附註工具用途 附註工具主要用於更新利用word附註應用程式生成的帶域 的附註,該工具在word右鍵 更新鏈結 的基礎上進行了優化,故在使用時,不能再利用word右鍵 更新鏈結 而要用本工具的 更新當前鏈結 或 更新所有鏈結 使用說明 一 更換路徑 當利用word附註應用程式生成帶域...

使用說明 農用遮光網使用說明

農用遮光網使用說明 建築防塵網購買方 建築施工企業 在購買建築防塵網時,應該對 作出比較,可以分辨品牌 型號,且購買時應該在一定程度上了解信譽良莠。建築防塵網購買方 市場售賣方 在選購建築防塵網時,可以把 作為基礎,好的 可以用來彌補信譽不足,而差的 則需要按照你的服務收費。農用遮光網使用說明 用途...

Hibernate tools 使用說明

05年的8月份第一次接觸hibernate tools,使用起來感覺還不錯,但也沒有深入研究,後來由於一直在做乙個專案,再後來用了一陣myeclipse,現在換了公司,使用wtp all in one eclipse的乙個版本 生成domain的時候使用了hibernate tools,發現都不知怎...