2011-08-11 17 views
2

私はマイクロ最適化code for identifying object typesです。私は、同じモジュールでインスタンス2つのオブジェクトが同じタイプを持っているかどうかをチェックするために、次を使用することができますと仮定します。等しいtype_infoアドレスは等しいタイプを意味しますか?

SomeCommonBase& first = ...; 
SomeCommonBase& second = ...; 
const type_info& firstInfo = typeid(first); 
const type_info& secondInfo = typeid(second); 

if(&firstInfo == &secondInfo || firstInfo == secondInfo) { 
    //identical types 
} else { 
    //different types 
} 

ロジックはtype_info参照が返されると、その参照の背後にあるオブジェクトがlive until the module is unloadedに保証されていることです。したがって、参照が返されると、他のオブジェクトは同じアドレスを占めることはできません。

したがって、アドレスが一致する場合は、一致するものはtype_infoオブジェクトと同じデータタイプです。インプリメンテーションが同じタイプの異なるtype_infoオブジェクトを返す場合は、type_info::operator==が呼び出され、追加チェックが実行されます。

これは正しい仮定ですか?

+0

私はVisual Studioがこれをあなたのためにすでに行っていると信じています。早すぎないように気をつけてください... –

+0

@Bo Persson:私は慎重に測定して、あなたが正しいと思っています。違いは非常に小さく、関数呼び出しを保存するだけです。とにかく私はどこでもわずかなスピードアップができるように小さなコードを変更しても構いません。 – sharptooth

答えて

3

明らかに。

等しいアドレスは、両方のポインタがメモリ内の同じオブジェクトを参照することを意味します。ポインタのタイプがtype_info*の場合、typeid()に渡されたオブジェクト(例:firstsecond)が同じタイプであることは明らかです。結局のところ、どのように同じアドレスを持つ2つのポインタは異なるタイプになるように異なるtype_infoオブジェクトを参照する可能性がありますか?

関連する問題