2009-04-15 69 views
6

据我了解,所有成员函数都是在d虚拟的,但是编译器是免费的,使功能非虚,如果它认为它们永远不会覆盖。有没有一种方法,以确保成员函数在d虚拟?

什么我不是清楚的是,当你编译在成员函数没有被重载一个模块,然后导入模块的其他地方,你重写一个成员函数会发生什么。我不认为它重新编译原始模块。它是否简单地假设任何具有外部链接的成员函数都是虚拟的?

回答

5

所有d成员函数是通过默认虚拟。我不认为有任何编译器实际上使得函数非虚拟化成为优化。尽管可以通过将类或函数标记为“final”来手动完成。

1

我相信FeepingCreature是正确的,但另外我认为你可以假设这样的优化只会被编译器考虑,如果它直接从源创建一个可执行文件。

2

FeepingCreature是除了不能进行虚拟模板函数大多正确。

2

这是如何实现的编译器和链接器特定的。但是虚拟函数调用可以被优化的一种常见情况是当你在本地实例化一个类时。然后函数调用可以直接此范围内进行,这是因为类的类型是在编译时完全清楚。这可以在编译器级别完成。除此之外,如果链接器实现函数实现不会被覆盖,那么链接器可能会进行优化,并用该类上的直接函数调用替换虚函数调用。特别是,如果一个类永远不会派生出来,那么所有对成员函数的调用都可以直接执行。就好像链接器会尽可能插入'final'关键字。 (链接器可能不会将此优化应用于导出的类和函数,因为链接器不知道函数是否在其他库或可执行文件中被覆盖。)

相关问题