在Eigen文档中,我找不到对延迟计算表达式的确切情况的解释。就我而言,我只对系数式表达式感兴趣(即没有混叠的可能性)。
例如,给定ArrayXXf a(10000, 10000);
a = a.cube() * a.cube();
在约250毫秒内为我评估,与
auto aCube = a.cube();
a = aCube * aCube;
而
ArrayXXf aCube = a.cube();
a = aCube * aCube;
需要大约550ms的时间进行评估。
将表达式分配给显式Array类型(例如ArrayXXf)是否总是强制对其求值?
该代码使用
MinGW release -O3
进行编译。这是一个一般性问题;这个例子是虚构的。
最佳答案
通常,是的,如果您为Array<...>
分配一个表达式,它将得到显式求值(除非编译器认为它可以完全优化该变量,否则情况尤其如此,特别是对于小型固定大小的数组而言)。
分配给auto
变量不执行任何求值(除非您的表达式以(...).eval()
结尾),这也意味着aCube * aCube
将对aCube
的每个系数进行两次评估(尽管编译器很聪明,可以弄清楚它可以重用该值)。在这种情况下,最好写a = aCube.square();