我必须制定一个小型框架,供我们的几个应用程序使用。最重要的是,该框架将在同一个应用程序中多次使用,但配置略有不同。配置的“性质”比仅具有一些配置选项和一些 setter 要复杂得多。在实践中,应用程序必须交付自己的数据结构,这些数据结构将被纳入框架,这使得它变得更加复杂。
我在写框架时可以看到以下4种备选方案:
- 将通用逻辑放在一个基类中,并告诉应用程序它应该从这个基类继承
- 将逻辑放在模板化类中,应用程序应在其中传递自己的类实现
- 在配置文件中描述应用的具体配置,并在构建过程中生成C++代码
- 提供可用于将“配置”扩展为实际代码的宏
在选择一个好的替代方案时应该考虑哪些参数?
这些替代方案中有一些比其他的更好吗?为什么?
请注意,就我而言,性能是重中之重。
最佳答案
如果峰值性能确实是一个问题,我会避免运行时多态性,这不仅是因为虚拟函数调用的 vtable 查找,还因为:
- 内联虚拟调用以允许有效的跨函数边界优化有点困难(这同样适用于编译到运行时加载的共享库(“插件”)的生成代码和使用编译器从生成代码编译的静态链接模块不支持链接时间优化)。
- 多态对象通常必须在堆上分配以避免切片,这可能会产生额外的运行时开销
宏往往难以调试,所以除非你需要它们进行字符串连接的能力,这是它们在某些情况下优于模板的独特优势,否则我个人会选择使用静态多态技术的基于模板的解决方案,就像你一样表示,curiously recurring template pattern和/或(如果适用)用于处理自定义数据结构的模板特化。
关于c++ - 基类与模板与生成的代码与宏的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863552/