2

C++ では、すべてのオブジェクトに VPTR がありますが、クラスごとに VTABLE は 1 つだけです。VPTR がすべてのオブジェクトに含まれているのはなぜですか? 重複じゃない?

4

5 に答える 5

3

実行時の型情報がないと、オブジェクトがどのクラスに属しているかわかりません。そのため、メソッドを呼び出すには、クラス情報を保存し、それを使用して呼び出す正しい vtable を検索する必要があります。すべてのオブジェクトにポインタを配置する方が簡単 (かつ直接的) です。

于 2013-05-23T11:02:02.180 に答える
3

メモリ内の C++ オブジェクトのインスタンスは、他にどのように VTABLE を参照しますか? ただし、VPTR-VTABLE はコンパイラ固有の実装であり、C++ 標準はそれについて何も述べていません。通常、これはポリモーフィック クラスのインスタンスの最初の (隠し) メンバーです。

このような非表示のメンバーを持つと、C++ メモリ モデルが C と互換性がなくなるため、代償が伴います。これはオーバーヘッドであることに同意しますが、メモリ内の C++ オブジェクトのインスタンスから VTABLE を参照する他の (より良い) 方法はありません。

于 2013-05-23T10:59:29.997 に答える
1

そのポインターは、オブジェクトの型を識別する唯一の方法です。各オブジェクトに 1 つ必要です。

于 2013-05-23T11:01:09.333 に答える