Mat*_*ips 4 c++ templates metaprogramming
Scott Meyers在"Effective C++"中指出了在编译器中执行例如矩阵运算的能力,这是在模板类/函数中实现某些算法的一个原因.但是这些函数不能对运行时确定的参数进行操作,显然 - 它们仅适用于写入程序的数字,或者最好作为编译器的参数.程序编译完成后,每次运行时都会使用相同的输出值.在这种情况下,为什么不只是用常规(非模板化)程序计算该值,并在必要时将其写入原始程序?计算例如1000磅并不快.编译器中的fft肯定比常规程序要好.
我能想到的最好的方法是,如果您需要为不同的客户端编译不同版本的程序,那么TMP可能会为您节省一些时间.但这是否真的需要每一个?
当涉及矩阵运算时,TMP的主要优点不是预先计算矩阵运算结果的能力,而是优化生成的代码以在运行时进行实际矩阵计算的能力.你是对的 - 你不太可能想要在程序中预先计算矩阵 - 但是想要在程序开始运行之前在编译时优化矩阵数学是三文鱼.例如,考虑以下代码:
Matrix a, b, c;
/* ... Initialize these matrices ... */
Matrix d = a + b + c;
Run Code Online (Sandbox Code Playgroud)
最后一行使用一些重载运算符来计算矩阵表达式.使用传统的C++编程技术,这将工作如下:
这很慢 - 没有充分的理由在这里制作任何值的任何副本.相反,我们应该只是循环遍历矩阵中的所有索引,并总结我们找到的所有值.但是,使用称为表达式模板的TMP技术,可以以一种实际上以智能,优化的方式而不是缓慢的标准方式进行此计算的方式来实现这些运算符.这是我认为迈耶斯在书中提到的这一系列技巧.
最着名的TMP示例是在编译时预先计算值的简单程序,但在实践中,这些实际上在实践中使用的复杂技术要复杂得多.
归档时间: |
|
查看次数: |
212 次 |
最近记录: |