【发布时间】:2022-01-23 00:04:45
【问题描述】:
考虑以下函数Foo:
// ...
Eigen::Vector3d Foo() {
Eigen::Vector3d res;
// ...
return res;
}
int main () {
Eigen::VectorXd foo = Foo(); // (1)
return 0;
}
由于返回值优化,(1) 行不应创建任何临时对象。但请考虑以下情况:
// ...
int main () {
Eigen::VectorXd foo;
// ...
foo.head<3>() = Foo(); // (2)
return 0;
}
(2) 是否创建任何临时对象?更一般地说,像(2) 那样初始化矩阵的任何块是否会创建任何临时对象?如果不是这种情况,那就太好了。否则,我可以重新定义 Foo 如下:
// ...
void AlternativeFoo(Eigen::Ref<Eigen::Vector3d> res) {
// Modify res
}
int main () {
Eigen::VectorXd foo;
// ...
AlternativeFoo(foo.head<3>()); // (3)
return 0;
}
(3) 是在不创建临时人员的情况下实现上述目标的唯一方法吗?
【问题讨论】:
-
不保证NRVO。
标签: c++ eigen3 temporary-objects return-value-optimization