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)
表达式的矢量化!