代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

是否有方法确保成员函数在D中是虚拟的?

d
  •  6
  • Ferruccio  · 技术社区  · 16 年前

    据我所知,所有成员函数在D中都是虚拟的,但是编译器可以自由地将函数设置为非虚拟的,如果它发现它们从未被重写过。

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

    4 回复  |  直到 12 年前
        1
  •  5
  •   FeepingCreature    16 年前

    默认情况下,所有D成员函数都是虚拟的。我不认为有任何编译器可以将函数作为优化而非虚拟化。但是,您可以通过将类或函数标记为“final”来手动执行。

        2
  •  2
  •   Tim Matthews    16 年前

    除了不能虚拟化的模板化功能外,feepingCreative基本上是正确的。

        3
  •  2
  •   Ralph Tandetzky    12 年前

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

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

        4
  •  1
  •   larsivi    16 年前

    我相信feepingcreature是正确的,但另外,我认为您可以假定,只有编译器直接从源代码创建可执行文件时,才会考虑这样的优化。