具有自动返回类型的特征强制转换-效率低于显式返回类型



将向量整数(即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是一个表达式模板,在使用之前不会进行求值。如果你不止一次使用它,那么它会被评估不止一次。如果评估成本高昂,那么不使用副本所节省的成本将因额外的评估时间而损失(附带利息(。

最新更新