在Eigen文档中,当表达式被延迟评估时,我找不到确切的说明。对我来说,只有系数表达很有意思,即没有混叠的可能性。
拿走,例如ArrayXXf a(10000, 10000);
,然后
a = a.cube() * a.cube();
在我的电脑上评估~250ms,与
相同auto aCube = a.cube();
a = aCube * aCube;
,而
ArrayXXf aCube = a.cube();
a = aCube * aCube;
在~550ms内进行评估。
是否有一种状态,即当表达式分配给显式数组类型(例如ArrayXXf)时,表达式总是被计算?
代码是使用MinGW版本-O3
编译的P.S。这是一个普遍的问题,这个例子刚刚结束
答案 0 :(得分:2)
通常,如果您将表达式分配给Array<...>
,则会明确评估它(除非编译器认为它可以完全优化掉该变量 - 可能就是这种情况,特别是对于小的固定大小的数组。 / p>
分配给auto
变量不进行评估(除非您的表达式以(...).eval()
结尾),这也意味着aCube * aCube
将评估aCube
的每个系数两次(尽管编译器可能足够聪明,可以发现它可以重用该值)。在这种特殊情况下,写a = aCube.square();