非ポリモーフィック継承にはこのポインター調整が必要ですか? 私が見たすべてのケースで、このポインタ調整は、使用された例がキーワードによるポリモーフィック継承を含むことを議論しましたvirtual
。
非ポリモーフィックな継承がこのポインタ調整を必要とするかどうかは私には明らかではありません。
非常に単純な例は次のとおりです。
struct Base1 {
void b1() {}
};
struct Base2 {
void b2() {}
};
struct Derived : public Base1, Base2 {
void derived() {}
};
次の関数呼び出しでは、このポインターの調整が必要ですか?
Derived d;
d.b2();
この場合、データ メンバーがアクセスされないため、 this ポインターの調整は明らかに不要です。一方、継承された関数がデータ メンバーにアクセスする場合は、このポインターの調整が適切な場合があります。一方、メンバー関数がインライン化されていない場合は、このポインターの調整がどうしても必要なようです。
これは実装の詳細であり、C++ 標準の一部ではないことは理解していますが、これは実際のコンパイラがどのように動作するかについての問題です。これが、すべてのコンパイラが同じ一般的な戦略に従う vtables のようなケースなのか、それとも非常にコンパイラに依存する質問をしたのかはわかりません。コンパイラに大きく依存している場合は、それ自体で十分な答えになります。または、必要に応じて、gcc または clang に焦点を当てることができます。