在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();

10-07 14:59