4

多重継承を使用すると、スライスによって親オブジェクトへのアドレスが葉オブジェクトへのアドレスとは異なります。

struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};

したがって、Zオブジェクトがある場合z、そのアドレス&zは親のアドレスと一致しません。は より 4 バイト高くなります。Ystatic_cast<Y*>(&z)&z

良い点static_castは、それが静的であるため、ランタイムを占有しないことです(dynamic_castつまり、 と比較して)。ただし、Z*を指すがある場合0、親へのすべてのキャストは null ポインターも生成する必要があります。なぜこれが機能し、どのように実装されるのですか? それは、すべての単一static_castが分岐命令を導入することを意味しますか?

4

1 に答える 1

7

はい、派生クラスへのポインターから基本クラスへのポインターへの暗黙的な変換と、そのstatic_cast逆の両方で、null ポインター値を保持する必要があります。これは、基本クラスのアドレスが派生クラスのアドレスと一致しない複数の継承の場合、通常、生成されたコードに分岐が必要であることを意味します。

理論的には、実装が「ゼロ」アドレスの周りのアドレス範囲を予約して null ポインターを表し、この場合の分岐を回避することは可能ですが、null ポインターの比較のための余分なチェックを追加するという犠牲が伴います。

于 2012-06-09T14:38:33.643 に答える