たとえば、Foo()
がクラスBar
の仮想メソッドである場合、継承するクラスはなく、コンパイラは、タイプがBar
(たとえば、Bar.Foo()
)であることをコンパイル時に推論することができます。 コンパイル時に、Bar::Foo()
が唯一可能なメソッドであることは明らかです。コンパイラは一般的に仮想メソッドの参照を最適化しますか?仮想メソッド呼び出しが最適化されているインスタンスがありますか?
0
A
答えて
2
はい、そのような場合はBar.Foo()
コールが最適化されます。 Hereは、そのような呼び出しがどのようにGCCコンパイラによってインライン化されるかの説明です。
GCCの開発者HonzaHubičkaからの記事のシリーズ全体が低レベルで実装されているかdevirtualization
、それが持っているものの制限事項について説明します。
0
仮想呼び出しを削除するコンパイラの最適化は、devirtualisation
と呼ばれます。コンパイラは、特定のオーバーロードが呼び出されていることを知るために、インスタンスの正確な型を知る必要があります。
あなたがそのようなクラスを持っていると仮定して、final
を使用することをお勧めします。これは、クラスが継承できないことを示したり、継承しているクラスがこの特定のメソッドをオーバーライドできないことを示します。
これらはすべてあなたのコンパイラに依存しますが、これはすでにある程度使用されています。
この最適化の大きな点は、コンパイラが正確な型を知る必要があり、クラスがそれを継承しないか、メソッド呼び出しをオーバーライドできないことを推測できることです。クラスに可視性が隠されている場合、LTOはメソッドが一度しか実装されていないことを知ることができましたが、まだ実装されていません。
関連する問題
- 1. 仮想メソッドの最適化
- 2. C++仮想メソッドが期待通りに呼び出されない
- 3. C++の呼び出し仮想メソッド
- 4. 仮想メソッドnullを呼び出すcontext.getSystemService
- 5. AsyncTask +データベースがヌルオブジェクトリファレンスで仮想メソッドを呼び出そうとしています
- 6. "java.lang.NullPointerException:仮想メソッドを呼び出そうとしています"というエラーが表示されます
- 7. 仮想継承に非仮想基本メソッドを呼び出す追加コストはありますか?
- 8. コンパイラはメソッド呼び出しを最適化できますか?
- 9. tkinter Buttonインスタンスに呼び出しメソッドがありません
- 10. Python - TypeError:バインドされていないメソッドtwitch_connect()は、インスタンスtwitchで呼び出される必要があります
- 11. C++、私は適切なクラスの静的メソッドを呼び出す仮想メソッド持つ仮想関数
- 12. 仮想メソッドがありませんstartDragAndDrop
- 13. テンプレートクラスの仮想関数が暗黙的にインスタンス化されていますか?
- 14. アンドロイドスタジオエラー:「java.lang.NullPointerExceptionが:仮想メソッドを呼び出そうと...」
- 15. C#で仮想メソッドを呼び出す代わりに
- 16. java.lang.NullPointerException:仮想メソッドを呼び出そうとしました 'android.graphics.RectF
- 17. NullPointerException:仮想メソッドを呼び出そうとしました
- 18. C++継承:まずベースの仮想メソッドが呼び出された後、派生メソッドが呼び出されます
- 19. typeofこれは、派生クラスから呼び出される仮想メソッド
- 20. APIが適切な呼び出しシーケンスを想定しているか、または仮定を検証する必要がありますか?
- 21. C++コンパイラは、同じポインタに対して繰り返される仮想関数呼び出しを最適化できますか?
- 22. サブクラスQCompleter、サブクラスの仮想スロットが呼び出されていない
- 23. ジェスチャー認識プログラムのメソッドが呼び出される前に呼び出せるメソッドはありますか?
- 24. PHPunitメソッドが1回呼び出されると予想され、実際に0回呼び出されます
- 25. ヌルオブジェクトリファレンスで仮想メソッド 'Bundle.getParcelableArrayList(java.lang.String)'を呼び出そうとしています
- 26. nullオブジェクト参照で仮想メソッド '...'を呼び出そうとしています
- 27. ヌルオブジェクト参照で仮想メソッドwidget.RecyclerView.setLayoutManagerを呼び出そうとしています
- 28. ヌルオブジェクトリファレンスで仮想メソッド 'void android.media.MediaRecorder.prepare()'を呼び出そうとしています
- 29. com.comp.Projectのnullオブジェクトリファレンスで仮想メソッド '...'を呼び出そうとしています
- 30. Android:nullオブジェクト参照で仮想メソッドを呼び出そうとしています
これはコンパイラ依存です –
これは実装に依存しますが、私はほぼすべての合理的なコンパイラが実際にこの最適化を行うと確信しています。 – lisyarus
"継承クラスはありません"これはほとんど検証できません。 –