【发布时间】:2022-08-09 00:23:12
【问题描述】:
我正在使用 c++17,但我无法选择我的编译器。
假设我有带有移动和复制语义的类型 S。通常对我来说 S 将是某种聚合类型的 std::vector 。我还使用了一个按值返回 S 的函数 g:
S g(int x);
进一步假设我正在编写这个函数 f,它带有一个 return 语句:
S f(int y) { ... return g(x);}
我有一个最终回报的选择:
(i) return g(x);
(ii) return S{g(x)};
(iii) S tmp = g(x); return tmp;
据我了解,(ii) 将保证复制省略,因此 S 从 g 的移动构造将在调用者的内存中构造。 (iii) 很有可能保证 NRVO,命名为返回值优化,所以 tmp 是 move 构造的,再次在调用者的内存中。 但是关于 (i) 可以说什么呢?
考虑到任何目标都需要良好的性能,您会选择哪一个?还是没有区别?
标签: c++ c++17 copy-elision nrvo return-by-value