使用自动 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
是一个表达式模板,在使用之前不会对其进行评估。如果您多次使用它,那么它会被多次评估。如果评估费用高昂,那么不使用副本所节省的费用(连同利息)将转化为额外的评估时间。
当将整数向量(即 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
的两次调用是否合并为临时调用。我希望如此。
无论如何,auto
with Eigen除非您确切地知道自己在做什么。在这种情况下,auto
是一个表达式模板,在使用之前不会对其进行评估。如果您多次使用它,那么它会被多次评估。如果评估费用高昂,那么不使用副本所节省的费用(连同利息)将转化为额外的评估时间。