将向量整数(即Eigen::VectorXi
(强制转换为双精度向量,然后对该双精度向量进行操作时,如果强制转换的返回类型为auto
,则生成的程序集将大不相同。
换句话说,使用:
Eigen::VectorXi int_vec(3);
int_vec << 1, 2, 3;
Eigen::VectorXd dbl_vec = int_vec.cast<double>();
与相比
Eigen::VectorXi int_vec(3);
int_vec << 1, 2, 3;
auto dbl_vec = int_vec.cast<double>();
以下是godbolt的两个例子:
VectorXd
返回类型:https://godbolt.org/z/0FLC4r
auto
返回类型:https://godbolt.org/z/MGxCaL
在这里使用auto
返回有什么后果?我原以为避免复制会更有效率,但现在我不确定了。
实际上,在问题中的代码中,您避免了副本(实际上,在使用dbl_vec
之前,它本质上是noop
(。然而,在godbolt上的代码中,您遍历原始int_vec
并对dbl_vec
求值至少两次,可能是三次:
max + std::log((dbl_vec.array() - max)
^^^ ^^^^^^^ ^^^
我不确定对max
的两个调用是否合并为临时调用。我希望如此。
在任何情况下,kmdreko都是正确的,除非你确切地知道自己在做什么,否则你应该避免将auto
与Eigen一起使用。在这种情况下,auto
是一个表达式模板,在使用之前不会进行求值。如果你不止一次使用它,那么它会被评估不止一次。如果评估成本高昂,那么不使用副本所节省的成本将因额外的评估时间而损失(附带利息(。