为什么我在类声明中避免使用`default`和内联函数?

主要观点:在共享库接口类声明中,应避免使用= default,以防生成不必要的函数实例化导致符号重复和程序膨胀。
关键信息:

  • 给出包含虚拟函数的抽象类Calc的声明及实现,使用= default生成了public inline析构函数和vtable等,当在两个不同库中实现该接口时,vtabletypeinfo会重复。
  • 虽链接应用程序代码时无链接时重复问题且动态链接器能处理,但从实际角度看仍存在潜在问题,如程序膨胀等。
  • 提出“RTTI 锚定”技术,即在库的cpp文件中实现至少一个虚拟函数(通常是虚拟析构函数),使 RTTI 包含在库中,避免其他地方创建重复。
    重要细节:
  • 示例代码中libsimplecalc.solibfastcalc.so的头文件和实现文件及相关符号查看。
  • 测试应用程序代码在不同情况下的动态链接器日志及分析。
  • 提到相关提案[pr1263r0]及其关闭原因。

总结:在共享库接口类声明中避免= default,采用“RTTI 锚定”技术可避免不必要的函数实例化和符号重复,减少程序膨胀等问题。测试代码可在[https://gitlab.com/twdev_proj...]找到。

阅读 9
0 条评论