//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,發現都不知怎...