使用自动 return 类型的本征转换 - 效率低于显式 return 类型?

Eigen cast with auto return type - Less efficient than explicit return type?

当将整数向量(即 Eigen::VectorXi)转换为双精度向量,然后对该双精度向量进行操作时,如果转换的 return 类型,则生成的程序集会截然不同是 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 return 类型:https://godbolt.org/z/0FLC4r

auto return 类型:https://godbolt.org/z/MGxCaL

这里对 return 使用 auto 有什么后果?我认为通过避免复制会更有效率,但现在我不确定。

确实,在问题的代码中,您避免了复制(实际上,在使用 dbl_vec 之前,它本质上是 noop)。然而,在godbolt上的代码中,你遍历了原始的int_vec并且至少计算了两次dbl_vec,可能三次:

max + std::log((dbl_vec.array() - max)
^^^             ^^^^^^^           ^^^

我不确定对 max 的两次调用是否合并为临时调用。我希望如此。

无论如何, is right and you should avoid using auto with Eigen除非您确切地知道自己在做什么。在这种情况下,auto 是一个表达式模板,在使用之前不会对其进行评估。如果您多次使用它,那么它会被多次评估。如果评估费用高昂,那么不使用副本所节省的费用(连同利息)将转化为额外的评估时间。