実行時型識別のためのランタイム

Home > 2005-07 / 実行環境 > This Entry [com : 0][Tb : 0]

2005-07-26

 ランタイムについての最後の話題は、実行時型識別(RTTI)のためのランタイムです。実行時型識別のためのランタイムは大きく分けて2種類があります。ひとつはtypeidによって参照するstd::type_infoオブジェクトであり、もうひとつはdynamic_castに関わるものです。

 typeidは、ちょうどsizeofのように型または式をオペランドにとる演算子です。sizeofは式を与えた場合でも、実際にその式が評価されることはありませんが、typeidに多相的クラス型の左辺値を渡した場合は、オブジェクトへのアクセスが発生します。

typeidに関するランタイムはオペランドが多相的クラス型の左辺値で、かつそれが空ポインタによる間接参照であった場合には、std::bad_typeid例外を送出する場合に必要になります。

class foo // 多相的クラス型
{
public:
virtual ~foo(); // 仮想関数があるので多相型になる
};
foo* p = 0;
typeid(*p); // 空ポインタによる間接参照が発生し、std::bad_typeidが送出される。


std::bad_typidクラスもstd::bad_alloc等と同じく単純なクラスですが、やはり仮想関数テーブルなどのランタイムが必要になります。また、例外を送出することになるので、例外処理のためのランタイムも必要になります。

 もうひとつはdynamic_castによるものですが、ここでも参照型のキャストの場合、変換に失敗した場合にはstd::bad_cast例外が送出されることになるため、std::bad_typeidと同様のランタイムが必要になります。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/7-f96f343c

C++と組み込み環境 | Page Top▲

New >>
フリースタンディング環境
<< old
例外処理のためのランタイム
ブログ内検索
RSSフィード