RVO与std::move

C++代码样例

std::vector<int64_t> ExtractUniqSkus(const Param& param) {                                                                                                                 
    std::vector<int64_t> ret;

// some basic operations on ret here
ret.push_back(...);
// return std::move(ret); return ret; }

return ret对应汇编

Dump of assembler code for function
   ...
   // 默认构造
   0x00000000032c3ac1 <+43>:  callq  0x31fe232 <std::vector<long, std::allocator<long> >::vector()>
   ...
   0x00000000032c3cf2 <+604>: mov    -0xd8(%rbp),%rax
   0x00000000032c3cf9 <+611>: add    $0xe8,%rsp
   0x00000000032c3d00 <+618>: pop    %rbx
   0x00000000032c3d01 <+619>: pop    %rbp
   0x00000000032c3d02 <+620>: retq  
End of assembler dump.

return std::move(ret)对应汇编

Dump of assembler code for function   ...
   // 默认构造
   0x00000000032c3abe <+40>:  callq  0x31fe232 <std::vector<long, std::allocator<long> >::vector()>
   ...
   // 移动构造
   0x00000000032c3ccb <+565>: callq  0x32cc8c4 <std::vector<long, std::allocator<long> >::vector(std::vector<long, std::allocator<long> >&&)>
   ...
   0x00000000032c3d27 <+657>: mov    -0xf8(%rbp),%rax
   0x00000000032c3d2e <+664>: add    $0x108,%rsp
   0x00000000032c3d35 <+671>: pop    %rbx
   0x00000000032c3d36 <+672>: pop    %rbp
   0x00000000032c3d37 <+673>: retq  
End of assembler dump.

总结

由于有RVO(Return Value Optimization)的存在,如果需要返回对象,就大胆的直接返回对象本身。

通过上面的汇编代码可以看到,直接返回对象,只调用了一次默认构造函数;加上std::move,反倒画蛇添足。

编译器本身的优化,已非常强大。

猜你喜欢

转载自www.cnblogs.com/anhongyu/p/12727587.html
RVO
今日推荐