6

据我了解,所有成员函数在 D 中都是虚拟的,但是如果编译器看到它们从未被覆盖,则可以自由地将函数设为非虚拟。

我不清楚的是,当您编译一个未覆盖成员函数的模块然后将该模块导入您覆盖成员函数的其他地方时会发生什么。我认为它不会重新编译原始模块。它是否只是假设任何具有外部链接的成员函数都是虚拟的?

4

4 回答 4

5

默认情况下,所有 D 成员函数都是虚函数。我不认为那里有任何编译器实际上使函数非虚拟作为优化。不过,您可以通过将类或函数标记为“final”来手动完成。

于 2009-04-15T12:08:35.003 回答
2

除了不能虚拟化的模板化函数之外,FepingCreature 大部分是正确的。

于 2009-04-16T01:11:54.370 回答
2

这是如何实现的是编译器和链接器特定的。但是可以优化虚函数调用的一种常见情况是当您在本地实例化一个类时。然后函数调用可以直接在这个范围内执行,因为类的类型在编译时是完全已知的。这可以在编译器级别完成。

除此之外,如果链接器意识到函数实现永远不会被覆盖,那么链接器可能会进行优化并将虚函数调用替换为对该类的直接函数调用。特别是,如果一个类从不派生,那么所有对成员函数的调用都可以直接执行。就好像链接器会尽可能插入“final”关键字。(链接器可能不会将此优化应用于导出的类和函数,因为链接器不知道函数是否在其他库或可执行文件中被覆盖。)

于 2012-07-24T15:55:51.403 回答
1

我相信 FeepingCreature 是正确的,但除此之外,我认为您可以假设只有编译器直接从源代码创建可执行文件时才会考虑此类优化。

于 2009-04-15T14:56:44.553 回答