たとえば、Foo()
がクラスBar
の仮想メソッドである場合、継承するクラスはなく、コンパイラは、タイプがBar
(たとえば、Bar.Foo()
)であることをコンパイル時に推論することができます。 コンパイル時に、Bar::Foo()
が唯一可能なメソッドであることは明らかです。コンパイラは一般的に仮想メソッドの参照を最適化しますか?仮想メソッド呼び出しが最適化されているインスタンスがありますか?
0
A
答えて
2
はい、そのような場合はBar.Foo()
コールが最適化されます。 Hereは、そのような呼び出しがどのようにGCCコンパイラによってインライン化されるかの説明です。
GCCの開発者HonzaHubičkaからの記事のシリーズ全体が低レベルで実装されているかdevirtualization
、それが持っているものの制限事項について説明します。
0
仮想呼び出しを削除するコンパイラの最適化は、devirtualisation
と呼ばれます。コンパイラは、特定のオーバーロードが呼び出されていることを知るために、インスタンスの正確な型を知る必要があります。
あなたがそのようなクラスを持っていると仮定して、final
を使用することをお勧めします。これは、クラスが継承できないことを示したり、継承しているクラスがこの特定のメソッドをオーバーライドできないことを示します。
これらはすべてあなたのコンパイラに依存しますが、これはすでにある程度使用されています。
この最適化の大きな点は、コンパイラが正確な型を知る必要があり、クラスがそれを継承しないか、メソッド呼び出しをオーバーライドできないことを推測できることです。クラスに可視性が隠されている場合、LTOはメソッドが一度しか実装されていないことを知ることができましたが、まだ実装されていません。
関連する問題
- 1. 仮想メソッドの最適化
- 2. NoSuchMethodError:MethodHandle、Androidで仮想メソッドが呼び出されない
- 3. C++仮想メソッドが期待通りに呼び出されない
- 4. C++の仮想デストラクタから仮想メソッドを呼び出す
- 5. C++の呼び出し仮想メソッド
- 6. 仮想メソッドnullを呼び出すcontext.getSystemService
- 7. AsyncTask +データベースがヌルオブジェクトリファレンスで仮想メソッドを呼び出そうとしています
- 8. 'vm'オブジェクトがVueインスタンス外にあり、内部メソッド呼び出しが呼び出されましたundefined
- 9. Netezza 7.2 UDFが2回呼び出されるインスタンス化メソッド
- 10. 仮想継承に非仮想基本メソッドを呼び出す追加コストはありますか?
- 11. "java.lang.NullPointerException:仮想メソッドを呼び出そうとしています"というエラーが表示されます
- 12. コンパイラはメソッド呼び出しを最適化できますか?
- 13. 親クラスの仮想関数で子クラスのメソッドが呼び出されない
- 14. リアクション仮想化。 List要素のpublicメソッドを呼び出すことは効果がありません
- 15. コピーコンストラクタの仮想ヘルパ関数が呼び出されない
- 16. tkinter Buttonインスタンスに呼び出しメソッドがありません
- 17. 基本仮想メソッドが呼び出されていないか、または2回呼び出されていません
- 18. Python - TypeError:バインドされていないメソッドtwitch_connect()は、インスタンスtwitchで呼び出される必要があります
- 19. C++、私は適切なクラスの静的メソッドを呼び出す仮想メソッド持つ仮想関数
- 20. 仮想メソッドがありませんstartDragAndDrop
- 21. テンプレートクラスの仮想関数が暗黙的にインスタンス化されていますか?
- 22. C#で仮想メソッドを呼び出す代わりに
- 23. アンドロイドスタジオエラー:「java.lang.NullPointerExceptionが:仮想メソッドを呼び出そうと...」
- 24. Android仮想メソッドを呼び出そうとしました
- 25. NullPointerException:仮想メソッドを呼び出そうとしました
- 26. 仮想メソッドを呼び出そうとしました 'void android.view.ViewOnClickListener
- 27. java.lang.NullPointerException:仮想メソッドを呼び出そうとしました 'android.graphics.RectF
- 28. 仮想メソッド 'java.lang.String android.content.Context.getPackageName()を呼び出そうとしました
- 29. 仮想メソッド 'android.content.res.XmlResourceParserを呼び出そうとしました。android.content.pm.ProviderInfo.loadXmlMetaData
- 30. typeofこれは、派生クラスから呼び出される仮想メソッド
これはコンパイラ依存です –
これは実装に依存しますが、私はほぼすべての合理的なコンパイラが実際にこの最適化を行うと確信しています。 – lisyarus
"継承クラスはありません"これはほとんど検証できません。 –