虽然我知道sealed可以出于安全原因使用,但也有一些人在叶子节点上使用sealed关键字作为一种优化技术。
这对优化有什么帮助?为什么编译器不够聪明,不能自己解决这个问题呢?
发布于 2010-06-28 20:51:48
在密封类中,对虚方法的调用可以绕过通常的虚方法查找,而直接转到派生最多的虚方法实现。原则上,编译器/JIT也可以内联这些调用。
对于非密封类,编译器无法解决这个问题,因为任何代码都可能在编译后出现并继承自您的类:编译器必须做最坏的打算。
发布于 2010-06-28 20:52:41
假设您有一个在leaf类中被覆盖的虚方法。这肯定不会被进一步覆盖,因此JIT编译器可能会对已知属于该叶类的目标的该方法进行内联调用。请注意,我不知道JIT是否真的执行了这种优化。
请注意,在Java中,JVM甚至可以对非最终类执行这种优化,因为它是一个多遍HotSpot :它可以乐观地假设没有任何东西会覆盖虚拟方法,然后如果加载了覆盖它的类,则撤消它的优化。当然,由于方法在Java中默认是虚拟的,这比在C#中要大得多。(即使默认值应该不重要,但它们显然很重要。)
就我个人而言,我不使用sealed,特别是出于优化或安全原因:我使用它是因为(正确地)为继承而设计很难。我同意“为继承而设计或禁止它”的概念,并且通常发现,不能从类派生的偶尔痛苦远远超过了不用担心继承的自由。YMMV.
发布于 2010-06-28 20:51:13
不,它在优化方面并没有真正的帮助。不管怎么说,这不是我从侧写中看到的。
https://stackoverflow.com/questions/3132453
复制相似问题