C 11 中的返回值优化与显式移动:使用哪个?
在 C 11 中,开发人员可以选择增强性能通过两种技术:返回值优化 (RVO) 和使用 std::move 的显式移动操作。在考虑使用哪种方法时,必须了解它们之间的差异及其各自的适用性。
返回值优化 (RVO)
RVO 是由编译器消除了不必要的复制操作。当函数的 return 语句涉及到生命周期在函数执行后立即结束的对象时,编译器可以通过直接返回对象的值来优化副本,从而避免其构造和销毁。
显式移动操作
使用 std::move 的显式移动操作会强制编译器移动对象的所有权,而不是复制它。这是通过将对象作为右值引用传递,然后在其返回值上调用 std::move 来实现的。
使用哪种方法?
在 RVO 之间进行选择时和显式移动,始终优先使用 RVO。复制省略是一种高效的编译器优化,可以显着提高性能。
如提供的代码片段所示,函数 read 可以使用 RVO 返回 SerialBuffer:
SerialBuffer read(size_t size) const { SerialBuffer buffer(size); read(begin(buffer), end(buffer)); return buffer; }
默认情况下,编译器将优化返回操作,尽可能消除复制的需要。
仅当无法应用 RVO 时才应使用显式移动操作。例如,如果对象的生命周期超出了函数的执行时间,则使用 std::move 可以明确表示移动对象所有权的意图。不过,这种情况应该很少见,RVO 一般就足够了。
以上是C 11 中的 RVO 与显式移动:我什么时候应该使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!