【问题标题】:best strategy for ensuring no copies in return by value确保没有副本以价值回报的最佳策略
【发布时间】: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


    【解决方案1】:

    使用(一)。

    (i) 和 (ii) 相同,自 C++17 起都保证零拷贝/移动。

    (ii) 中的额外构造函数调用根本没有帮助,它只是省略了强制性 RVO 的另一件事。

    (iii) 更糟:它保证在最坏的情况下移动,或者如果编译器执行 NRVO 则不移动(在这种情况下,它与 (i) 和 (ii) 相同)。

    【讨论】:

    • 谢谢 - 看起来确实是这样,但我在深入了解围绕这个主题的密集错误信息时遇到了麻烦!
    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多