【发布时间】:2014-01-05 03:37:30
【问题描述】:
如果我理解正确,移动语义允许从临时的、未命名的对象中移动和重用资源。 RVO,尽管前面的移动语义走得更远,“窃取”了整个对象,以避免额外的构造函数调用和赋值/复制函数。
这对我来说似乎有点反直觉,如果被调用的构造函数直接使用最终左值目标的地址来直接将数据放置在用户需要的位置,那不是更快、更简单和用户明显吗?
我的意思是,“在这个位置创建这个对象”似乎比“在某个地方创建这个对象,然后将它复制到正确的位置”更直观。
【问题讨论】:
-
好问题。我没有时间想一个完整的答案,但我相信调用链会让这成为一场噩梦(例如
A a = f(g(), h(i(), j()), k(l()));)。现在用户必须告诉f、g、h、i、j、k和l中的每一个它应该在哪里创建返回值。 -
@Angew - 在这种情况下,只有
f()会直接返回a的地址,其余的会返回它们用来调用f()的临时对象的地址。毕竟,唯一的分配是从f()的返回到a。 -
是的,但按照我的理解,这些临时对象可以直接在参数的位置(RVO)或函数的返回值位置中构造。
-
我认为这(接近)回答了同一个问题“如果我们已经拥有 RVO,移动语义会提供什么优化?” - stackoverflow.com/questions/5031778/…
-
@user2341104 如果您对提供地址的编译器感到满意,那么我一定误解了这个问题。 RVO 正是“在这个位置创建这个对象”。那么你到底在问什么?
标签: c++ optimization move-semantics return-value-optimization emplace