C++ 基类对模板对生成代码对宏';s

C++ 基类对模板对生成代码对宏';s,c++,data-structures,frameworks,extensibility,C++,Data Structures,Frameworks,Extensibility,我必须设计出一个小框架,它将被我们的几个应用程序使用。除此之外,该框架将在同一应用程序中多次使用,但配置略有不同。配置的“性质”比仅仅拥有一些配置选项和一些设置程序更复杂。在实践中,应用程序必须提供自己的数据结构,这些数据结构将被纳入框架中,这使得它更加复杂 在编写框架时,我可以看到以下4个备选方案: 将公共逻辑放在基类中,并告诉应用程序它应该从此基类继承 将逻辑放在模板类中,应用程序应在其中传递自己的类实现 描述应用程序在配置文件中的特定配置,并在生成过程中生成C++代码 提供可用于将“配置

我必须设计出一个小框架,它将被我们的几个应用程序使用。除此之外,该框架将在同一应用程序中多次使用,但配置略有不同。配置的“性质”比仅仅拥有一些配置选项和一些设置程序更复杂。在实践中,应用程序必须提供自己的数据结构,这些数据结构将被纳入框架中,这使得它更加复杂

在编写框架时,我可以看到以下4个备选方案:

  • 将公共逻辑放在基类中,并告诉应用程序它应该从此基类继承
  • 将逻辑放在模板类中,应用程序应在其中传递自己的类实现
  • 描述应用程序在配置文件中的特定配置,并在生成过程
  • 中生成C++代码
  • 提供可用于将“配置”扩展为实际代码的宏
在选择好的替代方案时,应该考虑哪些论点

这些替代方案中有一些比另一些好吗?为什么


请注意,在我的例子中,性能是最高优先级。

使用特定于平台的头文件。这是一个额外的替代方案,类似于宏,但没有缺点


如果必须使用宏,请仅在包含平台特定头的配置头中使用宏。但通常定义特定于平台的结构并将其用作子对象就足够了。

性能是什么意思?如果是最终代码运行的性能,请记住,包含虚拟函数的类继承解决方案在调用它们时将涉及少量开销


其他解决方案会为项目的构建阶段带来额外的开销,而且由于代码的“复制”(通过模板具体化、自定义代码生成或宏扩展),可执行文件会稍微大一些.

如果峰值性能真的是一个问题,我会避免运行时多线程现象,这不仅是因为虚拟函数调用的vtable查找,而且是因为:

  • 内联虚拟调用以实现高效的跨函数边界优化有点困难(这同样适用于编译到运行时加载的共享库(“插件”)的生成代码,以及使用不支持链接时优化的编译器从生成代码编译的静态链接模块)
  • 多态对象通常必须进行堆分配以避免切片,这可能会造成额外的运行时开销
宏往往很难调试,因此,除非您需要它们进行字符串连接的能力,这是它们在某些情况下相对于模板的独特优势,否则我个人会选择使用静态多态性技术的基于模板的解决方案,如您所指出的,和/或,如果适用,模板专门用于处理自定义数据结构。

“性能是最高优先级”这是每个人都说的。@John,在我的例子中(具有数百万数据结构的数学模拟应用程序,占用高达8GB的内存),性能确实是最高优先级。不必要的虚拟调用或间接指针访问可能是可用应用程序与不可用应用程序之间的区别。