主要观点:在共享库接口类声明中,应避免使用= default
,以防生成不必要的函数实例化导致符号重复和程序膨胀。
关键信息:
- 给出包含虚拟函数的抽象类
Calc
的声明及实现,使用= default
生成了public inline
析构函数和vtable
等,当在两个不同库中实现该接口时,vtable
和typeinfo
会重复。 - 虽链接应用程序代码时无链接时重复问题且动态链接器能处理,但从实际角度看仍存在潜在问题,如程序膨胀等。
- 提出“RTTI 锚定”技术,即在库的
cpp
文件中实现至少一个虚拟函数(通常是虚拟析构函数),使 RTTI 包含在库中,避免其他地方创建重复。
重要细节: - 示例代码中
libsimplecalc.so
和libfastcalc.so
的头文件和实现文件及相关符号查看。 - 测试应用程序代码在不同情况下的动态链接器日志及分析。
- 提到相关提案[pr1263r0]及其关闭原因。
总结:在共享库接口类声明中避免= default
,采用“RTTI 锚定”技术可避免不必要的函数实例化和符号重复,减少程序膨胀等问题。测试代码可在[https://gitlab.com/twdev_proj...]找到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。