什么时候使用TMP预先计算一个值实际上有用吗?

时间:2011-02-06 17:42:44

标签: c++ templates metaprogramming

斯科特迈耶斯在“有效的C ++”中指出了能够做到这一点的能力。编译器中的矩阵运算是在模板类/函数中实现某些算法的一个原因。但是这些函数不能对运行时确定的参数进行操作,显然 - 它们仅适用于写入程序的数字,或者最好作为编译器的参数。程序编译完成后,每次运行时都会使用相同的输出值。在这种情况下,为什么不只是使用常规(非模板化)程序计算该值,并在必要时将其写入原始程序?它不是更快来计算,例如一个1000磅。编译器中的fft肯定比普通程序好。

我能想到的最好的方法是,如果您需要为不同的客户编译不同版本的程序,那么TMP可能会为您节省一些时间。但这是否真的需要每一个?

1 个答案:

答案 0 :(得分:6)

当涉及到矩阵运算时,TMP的主要优点不是预先计算矩阵运算结果的能力,而是能够优化生成的代码以便在运行时进行实际的矩阵计算。你是对的 - 你不太可能想要在程序中预先计算矩阵 - 但是想要在程序开始运行之前在编译时优化矩阵数学是三文鱼。例如,请考虑以下代码:

 Matrix a, b, c;
 /* ... Initialize these matrices ... */
 Matrix d = a + b + c;

最后一行使用一些重载运算符来计算矩阵表达式。使用传统的C ++编程技术,这将工作如下:

  1. 计算b * c,返回一个保存副本的临时矩阵对象。
  2. 计算一个+ b + c,再次返回临时副本。
  3. 将结果复制到d。
  4. 这很慢 - 没有充分的理由在这里制作任何值的副本。相反,我们应该只是循环遍历矩阵中的所有索引,并总结我们找到的所有值。但是,使用名为expression templates的TMP技术,可以以一种实际以智能,优化的方式而不是缓慢的标准方式进行此计算的方式来实现这些运算符。这是我认为迈耶斯在书中提到的这一系列技术。

    最着名的TMP示例是在编译时预先计算值的简单程序,但在实践中,这些实际上在实践中使用的复杂技术要复杂得多。