C++11 具有自动返回类型的特征转换-效率低于显式返回类型?

C++11 具有自动返回类型的特征转换-效率低于显式返回类型?,c++11,eigen,C++11,Eigen,当将向量整数(即,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事实

当将向量整数(即,
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事实上,在问题中的代码中,您避免了一个副本(事实上,在使用
dbl_vec
之前,它本质上是一个
noop
)。但是,在锁紧螺栓上的代码中,您遍历原始
int_vec
并计算
dbl_vec
至少两次,可能三次:

max + std::log((dbl_vec.array() - max)
^^^             ^^^^^^^           ^^^
我不确定对
max
的两个调用是否折叠为临时调用。我希望如此


在任何情况下,都是正确的,你应该这样做,除非你确切知道自己在做什么。在这种情况下,
auto
是一个表达式模板,在使用之前不会进行计算。如果您多次使用它,那么它将被多次评估。如果评估成本很高,那么不使用副本所节省的成本(有兴趣地)将损失在额外的评估时间上。

事实上,在问题中的代码中,您避免使用副本(事实上,在使用
dbl_vec
之前,它本质上是一个
noop
)。但是,在锁紧螺栓上的代码中,您遍历原始
int_vec
并计算
dbl_vec
至少两次,可能三次:

max + std::log((dbl_vec.array() - max)
^^^             ^^^^^^^           ^^^
我不确定对
max
的两个调用是否折叠为临时调用。我希望如此


在任何情况下,都是正确的,你应该这样做,除非你确切知道自己在做什么。在这种情况下,
auto
是一个表达式模板,在使用之前不会进行计算。如果您多次使用它,那么它将被多次评估。如果评估费用昂贵,则不使用副本所节省的费用将丢失(附带利息)由于表达式的计算方式,Eigen的页面涵盖了使用
auto
的一些问题Eigen的页面涵盖了使用
auto
的一些问题,因为表达式的计算方式,
dbl\u vec
表达式中的转换确实执行了两次,但更重要的是,这防止了
max+std::log((dbl_vec.array()-max)
表达式的矢量化!在
dbl_vec
表达式中的强制转换确实执行了两次,但更重要的是,这防止了
max+std::log((dbl_vec.array()-max)
表达式的矢量化!